leetcode-268. 缺失數字刷題筆記(c++)

寫在前面

  • 題目簡單,多種方案嘗試求解
    • 注意:各段代碼初始值

題目詳情

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

示例 1:

	輸入: [3,0,1]
	輸出: 2
示例 2:

	輸入: [9,6,4,2,3,5,7,0,1]
	輸出: 8
說明:
你的算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?

ac代碼

  • 常規解法-標誌位
class Solution
{
public:
    int missingNumber(vector<int>& nums)
    {
        int n = nums.size();
        vector<int> bz(n+1, 0);
        for(int i=0; i<n; i++)
            bz[nums[i]] = 1;
        for(int i=0; i<n; i++)
        {
            if(!bz[i])
                return i;
        }
        return n;
    }
};
  • 新解法-公式求和法
    • 求和公式 1+2+…+n = n*(n+1)/2,遍歷數組做差值
class Solution
{
public:
    int missingNumber(vector<int>& nums)
    {
        int n = nums.size();
        long res = n * (n + 1) / 2;
        for(auto num: nums)
            res -= num;
        return res;
    }
};
  • 新解法-異或法
    • a ^ a = 0
    • 將所有數遍歷1次進行異或,再和0,1,2,…,n進行異或
    • 由於缺失數字只進行1次異或,所以異或後的結果就是缺失的數字
class Solution
{
public:
    int missingNumber(vector<int>& nums)
    {
        int res = nums.size();
        for(int i = 0; i < nums.size(); i++)
        {
            res = res ^ i;
            res = res ^ nums[i];
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章