leetcode 1539. 第 k 个缺失的正整数 c/c++

题目描述

  1. 第 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;
}

提交记录

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值