zoukankan      html  css  js  c++  java
  • 268 Missing Number 缺失的数字

    给出一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
    案例 1
    输入: [3,0,1]
    输出: 2
    案例 2
    输入: [9,6,4,2,3,5,7,0,1]
    输出: 8
    注意事项:
    您的算法应该以线性复杂度运行。你能否仅使用恒定的额外空间复杂度来实现它?

    详见:https://leetcode.com/problems/missing-number/description/

    Java实现:

    方法一:

    class Solution {
        public int missingNumber(int[] nums) {
            int res=nums.length;
            int i=0;
            for(int num:nums){
                res^=num;
                res^=i;
                ++i;
            }
            return res;
        }
    }
    

    方法二:

    class Solution {
        public int missingNumber(int[] nums) {
            int n=nums.length;
            int sum=0;
            for(int num:nums){
                sum+=num;
            }
            return (int)(0.5*n*(n+1)-sum);
        }
    }
    

    方法三:

    用二分查找法算出中间元素的下标,然后用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将r赋为m,反之则将l赋为m+1。排序的时间复杂度都不止O(n),但是在面试的时候,有可能数组就是排好序的,那么此时用二分查找法肯定要优于上面两种方法。

    class Solution {
        public int missingNumber(int[] nums) {
            Arrays.sort(nums);
            int l=0;
            int r=nums.length;
            while(l<r){
                int m=(l+r)>>1;
                if(nums[m]>m){
                    r=m;
                }else{
                    l=m+1;
                }
            }
            return r;
        }
    }

    参考:https://www.cnblogs.com/grandyang/p/4756677.html

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8761231.html
Copyright © 2011-2022 走看看