각 정수가 [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 | 
										
									
댓글