LeetCode:缺失數字

題目內容


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

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

示例 2:

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

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


解題

解題思路

  • 1.直接將數組元素排序
  • 2.從0開始循環判斷找到下標和數組下標元素不對應的項

代碼實現

public class Solution {
    public int MissingNumber(int[] nums) 
    {
        //排序數組
        Array.Sort(nums);
        int i = 0, end = nums[nums.Length - 1];
        //循環找到不對應項
        while (i <= end && i == nums[i])
        {
            i++;
        }

        //返回不對應項元素
        return i;
    }
}

改進一

解題思路

雖然上面的解法可以將值求出來但是沒法滿足“線性時間複雜度”這個要求

  • 1.可以採用桶排序思想,先創建一個桶【bool[]數組】
  • 2.然後循環遍歷將值對應下標位置設置爲true
  • 3.遍歷這個桶得到第一個爲false的下標位置

代碼實現

public class Solution {
    public int MissingNumber(int[] nums) 
    {
        //創建桶
        var bucket = new bool[nums.Length + 1];
        //循環遍歷將值對應下標位置設置爲true
        for (int i = 0; i < nums.Length; i++)
        {
            bucket[nums[i]] = true;
        }

        //遍歷這個桶得到第一個爲false的下標位置
        int j = 0;
        while (bucket.Length > j && bucket[j])
        {
            j++;
        }

        return j;
    }
}

改進二

解題思路

雖然上面的解法雖然滿足了“線性時間複雜度”要求,但是需要使用“額外的非常數空間

  • 1.先計算出0+1+2…+n 的和
  • 2.循環將元素從總和中減去,剩餘的數就是缺失的數了

代碼實現

public class Solution {
    public int MissingNumber(int[] nums) 
    {
        var sum = ((nums.Length + 1) * nums.Length) / 2;
        for (int i = 0; i < nums.Length; i++)
        {
            sum -= nums[i];
        }

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