268.缺失数字

题目

给定一个包含 0, 1, 2, ..., nn 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

复制

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

示例 2:

复制

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

说明: 你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

思路

这道题的思路有很多,我挑了最简单的两个来写.

  • 直接对输入的整型数组进行排序,排序了之后与0-n的序列进行逐个比较,如果遇到不相等,那就说明找到了这个缺失的数字.
  • 由于题目说明有且仅有一个数是缺失的,所以我们如果求出了不缺失情况下的和,减去现在数组的和,差值就是这个缺失的数字,而且由于这个0-n序列是一个等差数列,求和可以直接使用公式.

代码

排序法:

1
2
3
4
5
6
7
8
9
10
11
public int MissingNumber(int[] nums)
{
Array.Sort(nums);
for (int i = 0; i < nums.Length; i++)
{
if (i != nums[i])
{
return i;
}
}
}

求和法:

1
2
3
4
5
6
7
8
9
public int MissingNumber(int[] nums)
{
int sum = (nums.Length * (nums.Length + 1)) / 2;
for (int i = 0; i < nums.Length; i++)
{
sum -= nums[i];
}
return sum;
}