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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章