题目内容
给定一个包含 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;
}
}