美文网首页
Unsorted Array Problem Summary

Unsorted Array Problem Summary

作者: stepsma | 来源:发表于2016-12-11 05:54 被阅读0次

Unsorted Array,如果要求solution需要O(n) complexity,则往往需要hash table来辅助。而如果further follow up,需要O(1) space, 则需要借助原数组,来移动,或者改变元素。

Find All Numbers Disappeared in an Array (Leetcode 448)
https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/

用Hash Table,直接明了。

vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> ret;
        if(nums.empty()) return ret;
        unordered_map<int, int> mp;
        for(int i=0; i<nums.size(); i++){
            mp[nums[i]]++;
        }
        for(int i=1; i<=nums.size(); i++){
            if(!mp.count(i)) ret.push_back(i);
        }
        return ret;
    }

如果不用Hash Table,则需要对元素进行改变。而且一般需要扫两遍。这时,要抓住一些数组元素的特点。这道题的特点是所有元素都是大于0,而且元素都是在1到n之间,n为数组size。这样我们可以没loop到一个数,便将以该数为index的数组元素乘以-1。最后看谁大于0.

vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> ret;
        if(nums.empty()) return ret;
        for(int i=0; i<nums.size(); i++){
            int idx = abs(nums[i]) - 1;
            if(nums[idx] > 0) nums[idx] = -nums[idx];
        }
        for(int i=0; i<nums.size(); i++){
            if(nums[i] > 0) ret.push_back(i+1);
        }
        return ret;
    }

Find All Duplicates in an Array (Leetcode 442)
https://leetcode.com/problems/find-all-duplicates-in-an-array/

与上一题解法差不多,记住要取绝对值

 vector<int> findDuplicates(vector<int>& nums) {
        vector<int> ret;
        if(nums.empty()) return ret;
        for(int i=0; i<nums.size(); i++){
            int idx = abs(nums[i])-1;
            if(nums[idx] > 0) nums[idx] = -nums[idx];
            else ret.push_back(idx+1);
        }
        return ret;
    }

First Missing Positive (Leetcode 41):
https://leetcode.com/problems/first-missing-positive/

这道题用hash table的方法也比较明确。先把数组都放到hash table里,然后从1往上找,看哪个数最先没有被找到。

而如果需要constant space, 就还是要求改变数组位置。这里网上的解法是尽量把 1到n之间的数,放到其合适的位置上去(nums[i-1]),即将nums[i], 放到nums[nums[i] - 1]上面去。
最后再从1往上找,看哪个数不在其位置上。放置的方法很巧妙,需要swap。

int firstMissingPositive(vector<int>& nums) {
        if(nums.empty()) return 1;
        int n = nums.size();
        int i = 0; 
        while(i < n){
            if(nums[i] > 0 && nums[i] <= n && nums[i] != i+1 && nums[i] != nums[nums[i]-1]){
                int idx = nums[i]-1;
                swap(nums[i], nums[idx]);
            }
            else i++;
        }
        for(int i=1; i<=n; i++){
            if(nums[i-1] != i) return i;
        }
        return n+1;
    }

相关文章

网友评论

      本文标题:Unsorted Array Problem Summary

      本文链接:https://www.haomeiwen.com/subject/hjoumttx.html