解題思路
1、如果mid和該數相等,則說明不相等的數在右側,向右邊找
2、如果mid和該數不相等,則分兩種情況判斷
- 如果mid==0,說明位於數組的第一個元素,則說明缺少的就是mid;如果前一個元素和其下標相等,說明mid爲第一個不相等的數
- 如果沒有滿足上兩種情況,說明第一個不相等的數在左側,繼續往左找
3、繼續遞歸查找,如果發現left>right,說明沒有找到的這個數,就是第n個數
代碼
class Solution {
public:
int missingNumber(vector<int>& nums) {
return getMissIndex(nums, 0, nums.size()-1);
}
int getMissIndex(vector<int>& nums, int left, int right)
{
if (left > right) return nums.size();//如果最後都沒有找到,說明缺少的就是n
int mid = left + (right - left) / 2;
if (nums[mid]==mid)//該數相等,說明第一個不相等的數在右側,往右找
{
left = mid + 1;
}
else
{
if (mid==0||nums[mid-1]==mid-1)
//mid==0時,且mid!=mid則直接返回
//前一個相等,則說明該mid爲第一個不相等的數
{
return mid;
}
else //不滿足上述條件,說明第一個不相等的數在左側,往左找
{
right = mid - 1;
}
}
return getMissIndex(nums, left, right);
}
};