面试题53 - II:0~n-1中缺失的数字(C++)

时间:2020-03-31 11:27:19   收藏:0   阅读:110

题目地址:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

题目描述

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

题目示例

示例 1:

输入: [0,1,3]
输出: 2

示例 2:

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

解题思路

二分查找:排序数组中的搜索问题,首先想到二分查找方法,通过分析题目,我们可以将数组nums分为两部分,即左子数组nums[i]=i,右子数组nums[i]!=i,而题目所求缺失的数字恰好是右子数组首元素对应的索引值。接下来,就是具体的循环二分查找,我们先求得nums中点值mid,当nums[mid]=mid时,则右子数组的首位元素一定在区间[mid+1,right]之间,此时,执行i=mid+1,否则,左子数组的末尾元素一定在区间[left,mid-1]之中,此时执行j=mid-1。

非二分查找:我们令数组nums的大小n=nums.size()。如果n没在nums中出现的话,那么对于所有的0<=i<nums.size(),有nums[i]==i,即索引i处放置数字i,此时所求的缺失数字就是n,即nums.size(),如果n出现在nums中(出现在nums的最后一个位置),则在nums最后位置的前面有nums[i]!=i出现,此时i就是缺失的数字。

程序源码

二分查找

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        if(nums.size() < 1) return 0;
        int left = 0, right = nums.size() - 1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == mid)
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
        return left;
    }
};

非二分法

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        if(nums.size() < 1) return 0;
        int loss_number = nums.size();
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] != i)
            {
                loss_number = i;
                break;
            }
        }
        return loss_number;
    }
};

原文:https://www.cnblogs.com/wzw0625/p/12603042.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!