数据结构与算法 二分法 左闭右闭型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; int left = 0; int right = n - 1; while (left <= right) { int mid = (left + right) / 2; if (target == nums[mid]) { return mid; } if (target > nums[mid]) { left = mid + 1; } else { right = mid - 1; } } return left; } } 左闭右开型 注意此时right = nums.length 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; int left = 0; int right = n; while (left < right) { int mid = (left + right) / 2; if (target == nums[mid]) { return mid; } if (target > nums[mid]) { left = mid + 1; } else { right = mid; } } return left; } } 模板 根据红蓝边界和实际需要返回值,见 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; int left = -1; int right = n; while (left + 1 < right) { int mid = (left + right) / 2; if (nums[mid] < target) { left = mid; } else { right = mid; } } return right; // 实际需要的是红蓝边界的右边 } } Tips: 防止溢出的两种方法: 1 int mid = left + (right - left) / 2; 或 1 int mid = (left + right) >>> 1;