zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    spring3.2以后的cglib的jar包问题
    maven入门程序(二)
    maven安装配置(myeclipse)(一)
    spring中得到servletContext对象方法
    ftp上传java代码
    FileZilla ftp服务器安装
    spring junit参数
    说一说Servlet的生命周期?
    Servlet API中forward()与redirect()的区别?
    request.getAttribute()和 request.getParameter()有何区别?
  • 原文地址:https://www.cnblogs.com/liuzhenliang/p/LeetCode-TheMissingNumber.html
Copyright © 2011-2022 走看看