알고리즘

[leetcode] 41. First Missing Positive

JSYOvO 2021. 3. 25. 09:19
728x90
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        unordered_map<int, int> hash;
        int maxNum = 0;
        
        for(int num : nums){
            if(num <= 0) continue;
            
            hash[num]++;
            maxNum = max(maxNum, num);
        }
        
        for(int i = 1; i<=maxNum; i++){
            // cout<<i<<":"<<hash[i]<<endl;
            if(!hash[i]) return i;
        }
        
        
        
        return maxNum + 1;
    }
};
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        unordered_set<int> hash(nums.begin(), nums.end());
        int maxNum = 0;
        

        
        for(int i = 1; ; i++){
            // cout<<i<<":"<<hash[i]<<endl;
            if(!hash.count(i)) return i;
        }
        
        
        
        return 0;
    }
};

처음엔 단순하게 MAP/SET을 활용해서 나타나지 않은 수를 찾았습니다.

하지만 문제의 조건엔 메모리 제약을 걸어두었기에 최적의 해는 아닙니다.

 

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int size = nums.size();
        for(int n : nums){
            while(n >= 1 && n <= size && n != nums[n - 1]){
                swap(n, nums[n - 1]);
                
                // for(int nn : nums){
                //     cout<<nn<<". ";
                // }   cout<<endl;
            }
        }
        
        for(int i = 0; i < size; ++ i){
            if(i + 1 != nums[i]) return i+1;
        }
        
        
        
        return size + 1;

    }
};

다른사람들의 풀이를 확인해보니, 위와같은 방식으로 풀이합니다.

생각지도 못한방법인데 문제에 제공된 자료구조를 그대로 사용해서 메모리를 따로 사용하지 않고 해결합니다.

이러한 테크닉을 알게된 것만으로도 충분히 많은 것을 배울 수 있습니다.