找回密码
 立即注册
首页 业界区 业界 hot100之二分查找

hot100之二分查找

孙淼淼 2025-9-24 15:44:25
搜索插入位置(035)
  1. class Solution {
  2.     public int searchInsert(int[] nums, int target) {
  3.         int n = nums.length;
  4.         int lef = -1;
  5.         int rig = n;
  6.         while(lef+1 < rig){
  7.             int mid = (lef + rig) / 2;
  8.             if (nums[mid] < target){
  9.                 lef = mid;
  10.             }else rig = mid;
  11.         }
  12.         return rig;
  13.     }
  14. }
复制代码

  • 分析
基础二分
搜索二维矩阵(074)
  1. class Solution {
  2.     public boolean searchMatrix(int[][] matrix, int target) {
  3.         int m = matrix.length;
  4.         int n = matrix[0].length;
  5.         int lef = -1;
  6.         int rig = m*n;
  7.         while (lef+1 < rig){
  8.             int mid = (lef + rig) / 2;
  9.             int x = matrix[mid/n][mid%n];
  10.             if (x < target) lef = mid;
  11.             else if (x > target) rig = mid;
  12.             else return true;
  13.         }
  14.         return false;
  15.     }
  16. }
复制代码

  • 分析
把每一个row 横向相连, 作二分
在排序数组中查找元素的第一个和最后一个位置(034)
  1. class Solution {
  2.     public int[] searchRange(int[] nums, int target) {
  3.         
  4.         int start = searchLower(-1 ,nums, target);
  5.         if (start == nums.length || nums[start] != target) return new int[]{-1,-1};
  6.         int end = searchLower(start, nums, target+1) -1;
  7.         return new int[] {start, end};
  8.     }
  9.     private int searchLower(int lef, int[] nums, int target){
  10.         int rig = nums.length;
  11.         while (lef + 1 < rig){
  12.             int mid = (lef + rig) / 2;
  13.             if (nums[mid] < target) lef = mid;
  14.             else rig = mid;
  15.         }
  16.         return rig;
  17.     }
  18. }
复制代码

  • 分析
通过两次二分 查找 target 和target+1的起始位置, 确定target的范围
搜索旋转排序数组(033)
  1. class Solution {
  2.     public int search(int[] nums, int target) {
  3.         int n = nums.length -1;
  4.         int lef = -1;
  5.         int rig = n;
  6.         while (lef + 1< rig){
  7.             int mid = (lef + rig) / 2;
  8.             if (check(nums, target, mid)){       //target在mid右侧
  9.                 lef = mid;
  10.             }else rig = mid;
  11.         }
  12.         return nums[rig] == target ? rig : -1;
  13.     }
  14.     private boolean check(int[] nums, int target, int idx){   
  15.         int x = nums[idx];
  16.         int end = nums[nums.length-1];
  17.         if (x < end){
  18.             return x < target && target <= end;  // mid在小端 且比target小
  19.         }
  20.         // mid在大端 且< target在小端 || target > mid >
  21.         return x < target || target <= end;
  22.     }
  23. }
复制代码

  • 分析
判断 mid 在 →

  • 感悟
二分用来查找数据的拐点,  以作check()
寻找两个正序数组的中位数(004)


这题给我写晕厥了
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册