Missing Number -- leetcode

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?



算法一,異或

思路同問題Single Number:所有的數出現2次,只有一個數出現次。找出那個數。

1.對給出的數做一遍XOR。

2.對着期望的數全體做一遍XOR。

這樣,所有的數都做了2次XOR,只有那個缺失的數只做了一次XOR。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ans = 0, i = 0;
        for (auto n: nums)
            ans ^= n ^ ++i;
        return ans;
    }
};


算法二,SUM

1.將給出的數,做一個累加和

2. 將期望的數,做一個累加和,

3,兩者取差值。

此算法,不足之處,整數溢出問題。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int i = 0, sum = 0;
        for (auto n: nums) {
            sum += ++i - n;
        }
        return sum;
    }
};


算法三,交換

通過交換進行排序操作。

通過下標映射,將數直接交換到最終位置。

比如0, 移動到 nums[0];   3 移動到 nums[3]

最後,看一下,與下標不一致的數組元素。其下標即爲所求。


在交換過程時,當碰到元素值爲nums.size(),我們知道無法將其交換到最終位置。故作一個標誌,指示此不一致位置。

並暫時略過此位置的交換。這個位置的理想值,將在後面會交換過來。而那時,nums.size()這個值,將會挪到新位置。並隨之更新標記到新位置。


leetcode上實際執行時間爲40ms。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int missing = nums.size();
        for (int i=0; i<nums.size(); i++) {
            while (nums[i] != i) {
                if (nums[i] != nums.size())
                    swap(nums[i], nums[nums[i]]);
                else {
                    missing = i;
                    break;
                }
            }
        }
        return missing;
    }
};


我將此寫法也貼在了leetcode上

https://leetcode.com/discuss/56174/3-different-ideas-xor-sum-binary-search-java-code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章