題目內容
給定一個包含 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;
}
}