我先想的是把已经有的所有数放到set里面,然后从1开始,如果不能在set里找到当前的数,k就减1。
用时32ms
class Solution {
public:
int findKthPositive(vector<int>& arr, int k) {
set<int> existing(arr.begin(),arr.end());
int i = 0;
while(k)
{
i++;
if(existing.find(i) == existing.end())
{
k--;
}
}
return i;
}
};
方法2:看评论区学的方法:利用元素值和数组下标的关系。对于严格升序又不缺元素的数组,比如[1 2 3 4 5] ,下标是[0 1 2 3 4]。他们的关系是arr[i] = i+ 1。 如果有元素缺失的话,arr[i] > i+1,所以 arr[i]-i-1>0。如果缺的越多,相差就越大。找规律发现,只要arr[i]-i-1==k,就找到第k个缺失的。
12ms.
class Solution {
public:
int findKthPositive(vector<int>& arr, int k) {
int i;
for(i =0; i< arr.size();++i)
{
if( (arr[i]-i-1) >= k)
return k+i;
}
return k+i;
}
};