[LeetCode]268. Missing Number

来源:互联网 发布:淘宝商品软文范例 编辑:程序博客网 时间:2024/06/10 06:04

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;        }    }}




0 0
原创粉丝点击