leetcode-數組-簡單-缺失數字

題目

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。

來源:https://leetcode-cn.com/problems/missing-number/

示例 1:
輸入: [3,0,1]
輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

額外要求:

你的算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?

解答

方法一:

在不考慮線性時間複雜度的前提下,使用排序,然後查找的方法可以解決。我也就能想到這方法,後邊的方法二和方法三

實在是想不到,太巧妙了。

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

方法二:

思路是:

  • 求0-n和然後減去數組的和就是答案
  • 防止溢出,可以在加的同時進行減操作
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int sum = 0;
        /// 最大的數字爲 nums.size()
        /// 把 0 到 nums.size() + 1全部加一起來
        for (int i = 0; i < nums.size(); i++) {
            sum = sum + i - nums[i];
        }
        sum  += nums.size();
        return sum;       
    }
};

方法三:

異或法,

  • 相同的數異或操作之後是0
  • 異或操作之後最終結果就是缺失的那個數字
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        ///用異或抵消
        int res = 0;
        for (int i = 0; i < nums.size(); ++i) {
            res ^= nums[i];
            res ^= i;
        }
        res ^= nums.size();
        return res;
    }
};

 

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