“为什么你没有经常来!”
Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
Example 1:
Input: [3,0,1]
Output: 2
Example 2:
Input: [9,6,4,2,3,5,7,0,1]
Output: 8
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
关公面前耍大刀
class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
int totalSum = n*(n+1)/2;
int res = 0;
for(int num : nums){
res = totalSum - num;
}
return res;
}
}
一开始完全看不出自己哪里有问题?!
后来借助了Java Visualizer才发现…
我的本意是先算出总和,再每次减去数组里存在的元素。但是我并没有在循环里改变totalSum的值!
改正如下:
public int missingNumber(int[] nums) {
int n = nums.length;
int totalSum = n*(n+1)/2;
int res = totalSum;
for(int num : nums){
res -= num;
}
return res;
}
嗯!表现还不错!
Runtime: 0 ms, faster than 100.00% of Java online submissions for Missing Number.
Memory Usage: 40.3 MB, less than 36.61% of Java online submissions for Missing Number.
关公耍大刀
1.XOR
public int missingNumber(int[] nums) { //xor
int res = nums.length;
for(int i=0; i<nums.length; i++){
res ^= i;
res ^= nums[i];
}
return res;
}
不太理解为什么这样可以
2.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;
}