今天分享一道很简单的算法题。java
题目来源于 LeetCode 上第 268 号问题:缺失数字。题目难度为 Easy,目前经过率为 50.2% 。git
给定一个包含 0, 1, 2, ..., n
中 n 个数的序列,找出 0 .. n 中没有出如今序列中的那个数。github
说明:算法
你的算法应该具备线性时间复杂度。 你能够不使用额外空间来实现吗?数组
这道题目有三种解法。性能
和以前那道 只出现一次的数字 很相似:测试
只出现一次的数字: 给定一个非空整数数组,除了某个元素只出现一次之外,其他每一个元素均出现两次。找出那个只出现了一次的元素。网站
若是咱们补充一个完整的数组和原数组进行组合,那所求解的问题就变成了 只出现一次的数字。spa
将少了一个数的数组与 0 到 n 之间完整的那个数组进行异或处理,由于相同的数字异或会变为了 0 ,那么所有数字异或后,剩下的就是少了的那个数字。3d
class Solution {
public int missingNumber(int[] nums) {
int res = 0;
//注意数组越界状况
for (int i = 0; i < nums.length;i++){
// i 表示完整数组中的数字,与原数组中的数字 nums[i] 进行异或,再与保存的结果异或
res = res^i^nums[i];
}
//最后须要与循环中没法使用到的那个最大的数异或
return res^i;
}
}
class Solution {
public int missingNumber(int[] nums) {
int res = nums.length;
for (int i = 0; i < nums.length; ++i){
res ^= nums[i];
res ^= i;
}
return res;
}
}
//小吴以前担忧会数据溢出,不过估计这题考察的不是这个,因此测试用例没写这种吧,仍是能 AC 的
class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
int sum = (n+0)*(n+1)/2;
for (int i=0; i<n; i++){
sum -= nums[i];
}
return sum;
}
}
将数组进行排序后,利用二分查找的方法来找到缺乏的数字,注意搜索的范围为 0 到 n 。
注:因为一开始进行了排序操做,所以使用二分法的性能是不如上面两种方法。
public class Solution {
public int missingNumber(int[] nums) {
Arrays.sort(nums);
int left = 0;
int right = nums.length;
while (left < right){
int mid = (left + right) / 2;
if (nums[mid] > mid){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
}
本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。