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

被折叠的 条评论
为什么被折叠?



