본문 바로가기
LeetCode

287. Find the Duplicate Number c++ 문제 풀이

by O_x 2022. 7. 3.

각 정수가 [1, n] 범위 내에 있는 n + 1 정수를 포함하는 정수 배열을 지정합니다.
숫자로 반복되는 숫자가 하나뿐입니다. 이 반복된 숫자를 반환합니다.
배열 번호를 수정하지 않고 일정한 추가 공간만 사용하여 문제를 해결해야 합니다.

Medium 난이도

 

Example 1:

Input: nums = [1,3,4,2,2]
Output: 2

Example 2:

Input: nums = [3,1,3,4,2]
Output: 3

 

Constraints:

  • 1 <= n <= 105
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • All the integers in nums appear only once except for precisely one integer which appears two or more times.

 

Follow up:

  • 적어도 하나의 중복 번호가 숫자로 존재해야 한다는 것을 어떻게 증명할 수 있습니까?
  • 선형 런타임 복잡도에서 문제를 해결할 수 있습니까?

o(n log n)

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        
        for(int i = 0 ; i < nums.size(); ++i){
            
            if(nums[i]==nums[i+1]) return nums[i];
        }
    return 0;
    }
};

o(nlog n ) 으로 풀면 상당히 쉬운 문제이다. 

 

이문제가 Medium  난이도를 가지는 것은 o(n) timecomplexity로 풀며 공간복잡도(1) 을 사용할때라고 한다.

 

이 방식으로 풀기위해서 새로운 접근 법이 필요하다. 

nums가 이미 가지고 있는 nums에 표식을 새기는 것이다.

nums에 인자에 -를 붙혀주는 방식으로 할 수 있다.

 

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int duplicate = -1;
        for (int i = 0; i < nums.size(); i++) {
            int cur = abs(nums[i]);
            if (nums[cur] < 0) {
                duplicate = cur;
                break;
            }
            nums[cur] *= -1;
        }

        return duplicate;
    }
};

cur를 abs로 절댓값으로 만들어 배열의 인자의 크기를 벗어나는 경우를 막을 수 있다.

 

만약 nums에 이미 -인 값이 있다면 그 같은 중복된 수이므로 반복문을 탈출하고 duplicate를 리턴하게 된다.

 

운영중인 카톡방입니다.

https://open.kakao.com/o/gsMhUFie

 

C/C++/C# 언리얼/유니티 /질문

#C++#C#언리얼#게임개발#질문#개발#자료구조#백준#프로그래머스#c#유니티#unity#enreal

open.kakao.com

 

'LeetCode' 카테고리의 다른 글

28. Implement strStr() c++  (0) 2022.07.07
1. Two Sum Leetcode 문제  (0) 2022.07.04
581. Shortest Unsorted Continuous Subarray c++ 문제  (0) 2022.06.23
162. Find Peak Element c++ 문제  (0) 2022.06.21
88. Merge Sorted Array c++ 문제  (0) 2022.06.20

댓글