1060 有序数组中的缺失元素

给定一个独一无二的有序数组 A,找到从数组左侧开始的第 K 个缺失数字。例如,对于 A = [4, 7, 9, 10] 和 K = 1,第一个缺失数字是 5;对于 A = [4, 7, 9, 10] 和 K = 3,第三个缺失数字是 8。解决方案包括直接模拟和使用二分搜索算法来查找目标缺失值。" 120308343,11433137,Django模糊查询排序:全匹配优先,"['Django', 'Python', 'SQL']

题目描述:
给出一个有序数组 A,数组中的每个数字都是 独一无二的,找出从数组最左边开始的第 K 个缺失数字。

示例 1:
输入:A = [4,7,9,10], K = 1
输出:5
解释:
第一个缺失数字为 5 。

示例 2:
输入:A = [4,7,9,10], K = 3
输出:8
解释:
缺失数字有 [5,6,8,…],因此第三个缺失数字为 8 。

示例 3:
输入:A = [1,2,4], K = 3
输出:6
解释:
缺失数字有 [3,5,6,7,…],因此第三个缺失数字为 6 。

提示:
1 <= A.length <= 50000
1 <= A[i] <= 1e7
1 <= K <= 1e8

方法1:
主要思路:
(1)直接模拟从小到大,查取第 k 个缺失的数字;

class Solution {
public:
    int missingElement(vector<int>& nums, int k) {
        int cur_num=nums[0];//查取数字的起始位置
        int pos=0;
        while(k&&pos<nums.size()){
        	//跳过相同的数字
            while(pos<nums.size()&&cur_num==nums[pos]){
                ++cur_num;
                ++pos;
            }
            --k;
            if(k==0){//说明找到了第 k 小的缺失的数字
                return cur_num;
            }
            //若数组中的元素遍历完,则跳出循环,找数组范围之外的数字
            if(pos==nums.size()){
                break;
            }
            //缺失的数字
            ++cur_num;
        }
        while(k){//找出缺失的数字
            ++cur_num;
            --k;
        }
        return cur_num;
    }
};

方法2:
主要思路:
(1)二分搜索;
(2)每次比较当前位置下,从头到当前位置缺失的数字数量是否小于 k ,若是小于 k ,则将left更新,否则更新 right,则最终的终止位置是left==right,此时从0到right(或者说left)的缺失的数字个数为>=k,则使用 right-1(或者left-1)的位置进行计算缺失的数字;

class Solution {
public:
	//计算从0到当前index位置的缺失的数字的个数
    int missing_num(vector<int>&nums,int index){
        return nums[index]-nums[0]-index;
    }
    int missingElement(vector<int>& nums, int k) {
        int left=0;
        int right=nums.size()-1;
        if(missing_num(nums,right)<k){//说明缺失的数字的个数超出了数组的范围
            return nums[right]+k-missing_num(nums,right);
        }
        while(left<right){
            int mid=left+(right-left)/2;//中间位置
            //判断mid位置从 0 开始时,缺失的数字的个数是否小于 k
            if(missing_num(nums,mid)<k){
                left=mid+1;//进一步扩大范围
            }
            else{//超出范围了,则减小right
                right= mid;
            }
        }
        //根据找到的位置处,确定从0开始缺失的第 k 个数字
        return nums[left-1]+k-missing_num(nums,left-1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值