【发布时间】:2023-03-28 09:15:01
【问题描述】:
给定一个按严格递增顺序排序的正整数数组 arr 和一个整数 k。
查找此数组中缺少的第 k 个正整数。
示例 1:
输入:arr = [2,3,4,7,11], k = 5 输出:9 解释:缺少的正整数是 [1,5,6,8,9,10,12,13,...]。第 5 个缺失的正整数是 9。 示例 2:
输入:arr = [1,2,3,4], k = 2 输出:6 解释:缺少的正整数是 [5,6,7,...]。第二个缺失的正整数是 6。
约束:
1
1
1
arr[i]
我已提交此代码,但显示 TLE 错误。请解释为什么会发生 TLE 以及如何解决此问题。
class Solution {
public:
int findKthPositive(vector<int>& arr, int k) {
vector<int> ans;
int count=0,i=1,flag=0;
while(count<k)
{
int start=0,end=arr.size()-1;
while(start<=end)
{
int mid=start+(end-start)/2;
if(arr[mid]==i)
flag=1;
else if(arr[mid]>i)
end=mid-1;
else
start=mid+1;
}
if(flag==0)
{
ans.push_back(i);
count++;
}
i++;
}
return ans[k-1];
}
};
【问题讨论】:
-
你为什么要找 Mid。你能解释一下逻辑吗?我觉得这太复杂了。由于给定的数组已经排序,因此与此相比,直接方法可能会更快。
-
我正在使用二分法搜索元素 i
-
您也可以发布问题链接。可能是编辑您的问题。我认为 TLE 是由于这种“logn”额外的复杂性,因为逻辑似乎很好
-
最简单的解决方案将具有 O(n) 或 O(k) 的时间复杂度和 O(1) 的空间复杂度。方法是让 1 个
for循环从 1 变为 1000,并让 1 个counter计算当前总缺失整数。一旦counter在for循环中等于k,for循环的索引i就是答案。这种方法不需要二分查找逻辑。