剑指Offer 53-II. 0~n-1中缺失的数字

两种情况,nums[mid] == mid和不等于,其中不等于只有nums[mid] > mid的情况

通过循环二分,最后总能找到一个mid,使其满足nums[mid] > mid的情况,最终的结果也是返回left。

有两种情况

[0,1,2,4,5,6,7]

[01,2,3,5,6,7]

①中循环最后停止在right = mid - 1,且left停留在目标位置。

②中循环停止在left = mid  + 1,left停留在目标位置

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var missingNumber = function(nums) {
 6     let left = 0, right = nums.length - 1;
 7     while(left <= right) {// 结束时left = right - 1
 8         const mid = Math.floor((left + right) / 2);
 9         if(nums[mid] == mid) {
10             left = mid + 1;
11         }else {
12             right = mid - 1;
13         }
14     }
15     return left;
16 };

 使用二分模板进行变形的做法

其中若出现[0]数组则应返回1,即若数组每个位置都不缺数字,则是属于缺最后一个数字加一那个数字,所以最后要进行判断。

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var missingNumber = function(nums) {
 6     let left = 0, right = nums.length - 1;
 7     while(left < right) {
 8         const mid = Math.floor((left + right) / 2);
 9         if(nums[mid] == mid) {
10             left = mid + 1;
11         }else {
12             right = mid;
13         }
14         //console.log(right);
15     }
16     return right == nums[right] ? right + 1 : right;
17 };

 

posted @ 2021-09-05 15:37  雪之下。  阅读(50)  评论(0)    收藏  举报