1539. 第 k 个缺失的正整数

题目:

思路:

【1】单次遍历的方式

【2】二分的方式优化

代码展示:

【1】单次遍历的方式

//时间0 ms 击败 100%
//内存40.4 MB 击败 90.61%
//单次遍历的方式
class Solution {
    public int findKthPositive(int[] arr, int k) {
        int n = arr.length, max = arr[n-1], count = k , b = 0;
        for (int i = 1; i <= max; i++){
            if (i == arr[b]){
                b++;
            }else {
                count--;
            }
            if (count <= 0) return i;
        }
        return max + count;
    }
}

【2】二分的方式优化

// 时间0 ms 击败 100%
// 内存40.7 MB 击败 58.60%
class Solution {
    public int findKthPositive(int[] arr, int k) {
        // 如果一开始就缺失的足够多的情况
        if (arr[0] > k) return k;

        // 数组的边界值(这里的核心在于 r = arr.length,所以容易出现数组越界的情况)
        // 至于为什么要这样,是因为,一般二分之后使用的都是左边界的值(因为左边界必定是第一个超出的那位)
        // 还有就是如果是l = arr.length的情况由于是取前一位,所以也不会出现数组越界的情况
        int l = 0, r = arr.length;
        while (l < r) {
            int mid = (l + r) >> 1;
            int x = mid < arr.length ? arr[mid] : Integer.MAX_VALUE;
            if (x - mid - 1 >= k) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }

        return k - (arr[l - 1] - (l - 1) - 1) + arr[l - 1];
    }
}

 

posted @ 2023-08-10 12:23  忧愁的chafry  阅读(14)  评论(0编辑  收藏  举报