二分系列题
1. 搜索插入位置
/*** 查找插入的位置:返回第一个大于等于 target 的索引;* 如果 target 大于所有元素,则返回数组长度(即插入到末尾)*/
class Solution {public int searchInsert(int[] nums, int target) {int left = 0;int right = nums.length - 1;// 标准的二分模板while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1; // 插入点在右边} else {right = mid - 1; // 插入点在左边或当前}}// 循环结束后,left 就是插入位置(即第一个 >= target 的位置)return left;}public static void main(String[] args) {Solution solution = new Solution();int[] nums1 = {1, 3, 5, 6};System.out.println(solution.searchInsert(nums1, 5)); // 输出 2System.out.println(solution.searchInsert(nums1, 2)); // 输出 1System.out.println(solution.searchInsert(nums1, 7)); // 输出 4System.out.println(solution.searchInsert(nums1, 0)); // 输出 0}
}
2. 第一个大于等于 q 的位置索引
/*** 查找第一个大于等于 target 的位置* 如果不存在、返回 -1*/
class Solution {public int binarySearchFirstGreaterThanOrEqualToQ(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}// 检查 left 是否越界、且是否符合条件if (left < nums.length && nums[left] >= target) {return left; // 找到了符合条件的位置} else {return -1; // 没有任何元素满足 >= target}}public static void main(String[] args) {Solution solution = new Solution();int[] nums1 = {1, 3, 4, 4, 4, 4, 5, 5, 6};System.out.println(solution.binarySearchFirstGreaterThanOrEqualToQ(nums1, 4)); // 输出: 2int[] nums2 = {1, 2, 3};System.out.println(solution.binarySearchFirstGreaterThanOrEqualToQ(nums2, 5)); // 输出: -1int[] nums3 = {1, 2, 3};System.out.println(solution.binarySearchFirstGreaterThanOrEqualToQ(nums3, 2)); // 输出: 1}
}
3. 第一个大于 q 的位置索引
那就 是 第一个大于等于q+1的位置就行了
就是这个思想
class Solution {public int binarySearchFirstGreaterThanOrEqualToQ(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}// 检查 left 是否越界、且是否符合条件if (left < nums.length && nums[left] >= target) {return left; // 找到了符合条件的位置} else {return -1; // 没有任何元素满足 >= target}}public static void main(String[] args) {Solution solution = new Solution();int[] nums = {1, 3, 4, 4, 4,4,5,5,6};int target = 4;int result = solution.binarySearchFirstGreaterThanOrEqualToQ(nums, target+1);System.out.println(result);}
}
4. 最后一个大于等于q的位置索引
那就 第一个大于等于q+1的位置-1 就行了
class Solution {public int binarySearchFirstGreaterThanOrEqualToQ(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}// 检查 left 是否越界、且是否符合条件if (left < nums.length && nums[left] >= target) {return left; // 找到了符合条件的位置} else {return -1; // 没有任何元素满足 >= target}}public static void main(String[] args) {Solution solution = new Solution();int[] nums = {1, 3, 4, 4, 4,4,5,5,6};int target = 4;int result = solution.binarySearchFirstGreaterThanOrEqualToQ(nums, target+1);System.out.println(result);}
}