leetcode 268. Missing Number

来源:互联网 发布:linux 第二个mysql5.7 编辑:程序博客网 时间:2024/06/04 11:10

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?

好久没做到简单题了,真想抱住举高高亲亲T_T!!!

package leetcode;public class Missing_Number_268 {public int missingNumber(int[] nums) {int n=nums.length;int[] indexedNums=new int[n+1];for(int i=0;i<n;i++){int number=nums[i];indexedNums[number]=1;}for(int i=0;i<n+1;i++){if(indexedNums[i]==0){return i;}}return -1;}public static void main(String[] args) {// TODO Auto-generated method stubMissing_Number_268 m=new Missing_Number_268();int[] nums=new int[]{0,1,3};System.out.println(m.missingNumber(nums));}}

当然啦,大神怎么可以拘泥于一个方法呢?大神早就总结出4种方法啦!厉害厉害!

1.XOR

public int missingNumber(int[] nums) {    int xor = 0, i = 0;for (i = 0; i < nums.length; i++) {xor = xor ^ i ^ nums[i];}return xor ^ i;//最后i的值是nums.length,即与nums.length进行异或}
The basic idea is to use XOR operation. We all know that a^b^b =a, which means two xor operations with the same number will eliminate the number and reveal the original number.
In this solution, I apply XOR operation to both the index and value of the array. In a complete array with no missing numbers, the index and value should be perfectly corresponding( nums[index] = index), so in a missing array, what left finally is the missing number.

2.SUM

public int missingNumber(int[] nums) { //sum    int len = nums.length;    int sum = (0+len)*(len+1)/2;    for(int i=0; i<len; i++)        sum-=nums[i];    return sum;}
3.Binary Search
public int missingNumber(int[] nums) { //binary search    Arrays.sort(nums);    int left = 0, right = nums.length, mid= (left + right)/2;    while(left<right){        mid = (left + right)/2;        if(nums[mid]>mid) right = mid;        else left = mid+1;    }    return left;}