劍指 Offer 53 - II. 0~n-1中缺失的數字
知識點:陣列,二分查詢;
題目描述
統計一個數字在排序陣列中出現的次數。
示例
輸入: nums = [5,7,7,8,8,10], target = 8
輸出: 2
輸入: nums = [5,7,7,8,8,10], target = 6
輸出: 0
解法一:二分查詢
看到排序陣列--> 二分查詢;
根據題目:可以根據是否和索引對應分成兩部分:
- 1.nums[i] == i; 索引和值能一一對應上;
- 2.nums[i] != i; 索引和值對不上了;
我們要找的就是第一個對不上的時候的索引;也就是右子陣列的首位元素;
和33題一樣,要明確的一點是最後執行的一定是left=right=mid,而且此時mid左側都是對應的,mid右側都是不對應的,所以判斷此刻mid的值:
- 1.nums[mid] == mid; 那left=mid+1就是第一個不匹配的;
- 2.nums[mid] != mid,那left就是第一個不匹配的;
所以最後返回left就可以了。
class Solution {
public int missingNumber(int[] nums) {
int left = 0, right = nums.length-1;
while(left <= right){
int mid = left + ((right-left) >> 1);
if(nums[mid] == mid){
left = mid+1; //一定在右邊;
}else{
right = mid-1; //可能正好是mid,但是我們還是可以mid-1,因為最後如果相等了,我們返回的是left;
//在上面執行了+1的操作,所以正好是不等的。要始終明白在最後時刻的時候,left=mid=right,而且mid左邊都排好了,mid右邊都亂了,只要看mid這個就行了;
//(注意和153題區分,那裡就不能減1);
}
}
return left;
}
}