剑指offer53_0~n-1中缺失的数字
这道题我感觉主要考察的二分查找算法,用L记录最左边元素下标,R记录最右边元素下标,mid记录L与R中间元素下标,对于下标mid来说,如果 nums[mid] == mid ,则说明L到mid之间的元素不存在缺失的数字,往右查找即可,反之往左查找。
代码如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
if(nums.size() == 1) //只有一个元素的情况
{
return nums[0] == 0 ? 1 : 0;
}
if(nums[nums.size() - 1] == nums.size() - 1) //不存在缺失元素的情况,返回最后一个元素+1的值,恰好等于nums.size()
{
return nums.size();
}
int L = 0, R = nums.size() - 1;
while(L <= R)
{
int mid = (R- L)/2 + L;
if(nums[mid] == mid)
{
L = mid + 1; //往右查找
}
else
{
R = mid - 1; //往左查找
}
}
return nums[L] != L ? L : R; //此时要么L下标元素为缺少的那个数字或者R下标元素
}
};