classSolution{ publicintsearchInsert(int[] nums, int target){ int l = 0, r = nums.length - 1; //初始的搜索范围是整个数组,左右边界分别是 left 和 right。如果我们在搜索过程中设定了 left < right 作为循环条件, //那么当 left 等于 right 时,循环将终止,此时还未检查该位置的元素。设定为 left <= right 可以确保在每次缩小搜索范围时, //仍然包含当前范围的所有可能位置,最终检查所有可能的位置。 while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] < target) { l = mid + 1; } else { r = mid - 1; } } return l; } }
classSolution{ publicbooleansearchMatrix(int[][] matrix, int target){ int m = matrix.length, n = matrix[0].length; int l = 0, r = m * n - 1; while (l <= r) { int mid = (l + r) / 2; int row = mid / n; int col = mid % n; if (target > matrix[row][col]) { l = mid + 1; } elseif (target < matrix[row][col]) { r = mid - 1; } else { returntrue; } } returnfalse; } }
classSolution{ publicint[] searchRange(int[] nums, int target) { //找到第一个小于target的位置和第一个大于target的位置 int n = nums.length; if (n == 0) { returnnewint[] {-1, -1}; } //在数组中找到第一个大于等于target的目标 int a = searchInsert(nums, target);
//在一个有序数组中找第一个大于等于 target+1的下标 就相当于找到最后一个大于target的下标 int b = searchInsert(nums, target + 1) - 1; if (a > b) { // 数组中不存在target returnnewint[] {-1, -1}; } returnnewint[] {a, b}; }
publicintsearchInsert(int[] nums, int target){ //left左边的部分全部小于target,并以right结尾;right右边的部分全部大于等于target,并以left为首 int l = 0, r = nums.length - 1; while (l <= r) { int mid = l + (r - l)/2; if (nums[mid] < target) { l = mid + 1; } else { //在一个有序数组中找第一个大于等于 target的下标 r = mid - 1; } } return l; } }