剑指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 };

浙公网安备 33010602011771号