题目描述
- 第 k 个缺失的正整数
难度
简单
给你一个 严格升序排列 的正整数数组 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,...] 。第 2 个缺失的正整数为 6 。
提示:
1 <= arr.length <= 1000
1 <= arr[i] <= 1000
1 <= k <= 1000
对于所有 1 <= i < j <= arr.length 的 i 和 j 满足 arr[i] < arr[j]
通过次数19,961提交次数37,004
代码
int findKthPositive(int* arr,int arrSize,int k){
//int* b =malloc(sizeof(int)*1001); //c,#include<stdio.h>
int *b=new int[1001]; //c++#include<iostream>
for(int i=0;i<arrSize;i++){ //sizeof(arr)/sizeof(arr[0]
b[i]=arr[i]-i-1;
}
int j=0;
while(k>b[j] && j<arrSize){
j++;
}//第k个数在arr数组以内的情况
int x=0,y=0;//k和b[j]之间的差距
if(k>b[arrSize-1]){//j超过数组时用这个
j=arrSize-1;
x=k-b[j];
y=x+arr[j];
return y;
}
x=k-b[j];
y=x+arr[j]-1;
return y;
}
完整测试代码-b
包括用例`
//leetcode 1539 第k个缺失的正数
/**算法思想
1.可以观察到,首先序列时1 2 3 4 5 6 7 8 9 10 11 12 13 这种以1为开始依次递增的序列
2.那么arr数组中的数据就可以观察到这么一个情况,
arr数组中第1个数对应的值为arr[0],在递增序列中的第arr[0]个数,在第arr[0]个数之前缺失了arr[0]-1个数
arr数组中第2个数对应的值为arr[1],在递增序列中的第arr[1]个数,在第arr[1]个数之前缺失了arr[1]-2个数
arr数组中第个数对应的值为arr[2],在递增序列中的第arr[2]个数,在第arr[2]个数之前缺失了arr[2]-3个数
arr数组中第个数对应的值为arr[i],在递增序列中的第arr[i]个数,在第arr[i]个数之前缺失了arr[i]-i-1个数
*/
#include<iostream>
using namespace std;
int findKthPositive(int* arr,int arrSize,int k){
//int* b =malloc(sizeof(int)*1001);
int *b=new int[1001];
for(int i=0;i<arrSize;i++){//sizeof(arr)/sizeof(arr[0]
b[i]=arr[i]-i-1;
}
int j=0;
/**
输入:arr = [1,2,3,4], k = 2
输出:6
解释:缺失的正整数包括 [5,6,7,...] 。第 2 个缺失的正整数为 6
*/
// if(k<b[0]){//1 2 3 4 5 6 7 8 9 10 11 12 13 ,如果arr[0]=6,k=5
// return k;
// }
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 0 1 2 3 4 5 6 7 8 j
// # 5 6 7 9 11 12 14 15 16 k=4 arr
// 4 4 4 5 6 6 7 7 7 b
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//0 1 2 3 4 5 6 7 j
//1 2 5 8 9 11 15 16 k=7 arr
//0 0 2 4 4 5 # 8 8 b
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//0 1 2 3 4 5 6 7 8 8 9 j
//1 2 3 4 5 7 8 9 11 15 16 k=2 arr
//0 0 0 0 0 1 1 1 # 2 5 5 b
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//0 1 2 3 5 6 7 8 9 10 j
//1 2 3 4 7 8 9 11 15 16 k=2# ,k=8$ arr
//0 0 0 0 # 2 2 2 3 6 6 $(k>b[arrSize]) b
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//0 1 2 3 j
//1 2 3 4 k=2 arr
//0 0 0 0 # b
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 0 1 2 3 4 j
// 2 3 4 7 11 k=5 arr
// 1 1 1 3 6 b
while(k>b[j] && j<arrSize){
j++;
}//第k个数在arr数组以内的情况
int x=0,y=0;//k和b[j]之间的差距
if(k>b[arrSize-1]){//j超过数组时用这个
j=arrSize-1;
x=k-b[j];
y=x+arr[j];
return y;
}
x=k-b[j];
y=x+arr[j]-1;
return y;
/**如果第k个数在arr数组之外的情况*/
}
int main(){
int arr[10]={1,2,5,8,9,11,15,16};
int brr[9]={5,6,7,9,11,12,14,15,16};
int crr[11]={1,2,3,4,5,7,8,9,11,15,16};
int drr[11]={1,2,3,4,7,8,9,11,15,16};
cout<<"kkk a:"<<findKthPositive(arr,8,7)<<endl;
cout<<"-----------------"<<endl;
cout<<"kkk b:"<<findKthPositive(brr,9,4)<<endl;
cout<<"-----------------"<<endl;
cout<<"kkk c:"<<findKthPositive(crr,11,2)<<endl;
cout<<"-----------------"<<endl;
cout<<"kkk d:"<<findKthPositive(drr,10,2)<<endl;
return 0;
}