一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/que-shi-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
哈希表,直接遍历,位运算,二分查找,都可以做。
由于已经排好序了,二分查找应该是最快的(大概吧),而且不改变原数组的结构。
class Solution { public int missingNumber(int[] nums) { // 边界问题 if (nums[0] == 1) { return 0; } else if (nums[nums.length - 1] == nums.length - 1) { return nums.length; } int len = nums.length; int left = 0; int right = len - 1; int mid = 0; while (left < right) { mid = (left + right) / 2; if (nums[mid] > mid) { right = mid - 1; // 遇到边界 if (right < 0) { return 0; // 遇到答案 } else if (nums[right] == right) { return right + 1; } } else { left = mid + 1; // 边界 if (left >= len) { return len; // 答案 } else if (nums[left] > left) { return left; } } } return -1; } }
一大堆if判断,其实重新整理思路后发现很多都是没有必要的,优化后的代码如下:
class Solution { public int missingNumber(int[] nums) { int left = 0; int right = nums.length - 1; while(left <= right) { int mid = (left + right) / 2; if(nums[mid] == mid) { left = mid + 1; } else { right = mid - 1; } } return left; } }
标签:right,return,nums,int,Offer,mid,53,---,left From: https://www.cnblogs.com/allWu/p/17238181.html