leetcode刷题之1539题第 k 个缺失的正整数

63 篇文章 0 订阅
13 篇文章 0 订阅

给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。

请你找到这个数组里第 k 个缺失的正整数。

示例 1:

输入:arr = [2,3,4,7,11], k = 5
输出:9
解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,...] 。第 5 个缺失的正整数为 9 。

这道题依然是一个升序数组,但是不是连续的,中间有断层,但是下标+1表示应当前位置储存的数据。根据这个规律我们可以得到一个结论,arr[下标]-下标-1表示前面缺失的数的个数。到此,我们就可以采用二分了,直接上代码。

  public int findKthPositive(int[] arr, int k) {
         
         int left=0;//左边界

         int right=arr.length-1;//右边界

         if(arr[0]>k){//当数组第一位都大于缺失的数量时,说明缺失的数量就是数本身直接返回k
             return k;
         }

         while(left<right){
             int mid=(left+right)>>1;//位运算向右移一位相当于除以2

             if((arr[mid]-mid-1)>=k){//当前下标下缺失的数大于目标缺失的数时,右边都比目标缺失数大
                 right=mid;
             }else{
                 left=mid+1;//与上面相反
             }
         }
         if((arr[right]-right-1-k)>=0){//由于每次循环结束 当表达式大于等于0时说明缺失数比当前数小或相等
             return right+k;//right+k 等价于 arr[right]-(arr[right]-right-1-k+1)
         }else{
             return right+k+1;//等价于arr[right]-(arr[right]-right-1-k)
         }
         
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值