[LeetCode]268. Missing Number

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Note:

Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?


给的例子很明白了,就是说在一个连续的n个数的数组中,有一个数缺失,所以你要找到那个数。

我们可以想像如果没有那个缺的数,整个数组的长度应该为n+1,因为是从0开始。那么也就是说现在这个数组的长度是n。我最初的想法是一个loop从0到数组长度进行一个个比较,但因为这样会超出数组的长度,所以我们要想另一个办法。其实很简单做一个sum就好,然后把两个sum相减就能得到这样的一个数。

public class Solution {
    public int missingNumber(int[] nums) {
        int expec = 0;
        int actual = 0;
        for(int i =0;i<=nums.length;i++){
            expec+=i;
        }
        for(int i=0;i<nums.length;i++){
            actual+=nums[i];
        }
        
        return expec - actual;
    }
}
这种方法比较简单,一般真实面试的时候面试官不会那么容易就让你过的,而且如果考虑数值比较大的话,int形可能就不能做到我们的要求了。这时有一个非常简便的方法,就是首先排序一下数组,让这个数组有序以后,我们要找一个数自然想到的就是二分法。有同学会问,那这样又排序又二分,时间复杂度不是要O(nlogn+logn)了吗,但如果你提前问一下面试官,这个数组是否排序过,这样不就行了?如果排序过那二分无疑是最好的。那这里二分的条件是什么呢?就是下标index是否小于当前的index的数,如果小于,说明缺失的数在左侧,如果等于说明缺失的数在右侧。代码如下:

public class Solution {
    public int missingNumber(int[] nums) {
        Arrays.sort(nums);
        int start = 0;
        int end = nums.length;
        int mid;
        while(start+1<end){
            mid=start+(end-start)/2;
            if(nums[mid]!=mid){
                end=mid;
            }else{
                start=mid;
            }
        }
        if(nums[start]!=start){
            return start;
        }else{
            return end;
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值