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]; } }