欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 二分查找【Lecode_HOT100】

二分查找【Lecode_HOT100】

2025/2/25 15:05:24 来源:https://blog.csdn.net/qq_49288362/article/details/144568429  浏览:    关键词:二分查找【Lecode_HOT100】

文章目录

        • 1.搜索插入位置No.35
        • 2.搜索二维矩阵No.74
        • 3.在排序数组中查找元素的第一个和最后一个位置No.34
        • 4.搜索旋转排序数组No.33
        • 5.寻找旋转排序数组中的最小值No.153

1.搜索插入位置No.35

image-20241213095145962

class Solution {public int searchInsert(int[] nums, int target) {int l = 0;int r = nums.length-1;while(l<=r){int mid = (l+r)>>1;if(nums[mid]==target){return mid;}else if(nums[mid]<target){l = mid+1;}else{r = mid-1;}}return l;}
}
2.搜索二维矩阵No.74

image-20241213101449850

image-20241213101500070

  • 方法一:遍历
public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;for(int i = 0;i < m;i++){for (int j = 0;j < n;j++){if(matrix[i][j]==target){return true;}}}return false;}
  • 方法二:二分
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;// 定义二分查找的左右边界int left = 0;int right = m * n - 1;while (left <= right) {// 计算中间位置int mid = left + (right - left) / 2;// 将一维索引转换为二维矩阵中的行和列int row = mid / n;int col = mid % n;int midVal = matrix[row][col];if (midVal == target) {return true; // 找到目标值} else if (midVal < target) {left = mid + 1; // 在右半部分查找} else {right = mid - 1; // 在左半部分查找}}return false; // 未找到目标值}
}
3.在排序数组中查找元素的第一个和最后一个位置No.34

image-20241218085654543

  • 思路:acwing整数二分
 public int[] searchRange(int[] nums, int target) {// 创建返回值数组int[] res = new int[2];res[0] = -1; // 默认值是 -1res[1] = -1; // 默认值是 -1int l = 0;int r = nums.length - 1;// 寻找左边界while (l <= r) {int mid = (l + r + 1) >> 1;if (nums[mid] == target) {res[0] = mid;r = mid-1;  //继续向左搜索} else if (nums[mid] < target) {l = mid + 1;} else {r = mid - 1;}}// 寻找右边界l = 0;r = nums.length - 1;while (l <= r) {int mid = (l + r) >> 1;if (nums[mid] == target) {res[1] = mid;l = mid+1; //继续向右搜索} else if (nums[mid] > target) {r = mid - 1;} else {l = mid + 1;}}return res;}
public int[] searchRange(int[] nums, int target) {int l = 0;int r = nums.length - 1;int[] res = new int[2];res[0] = -1;res[1] = -1;if (nums.length == 0 || nums == null)return res;while (l < r) {int mid = (l + r ) >> 1;if (nums[mid] >= target) {r = mid;} else {l = mid + 1;}}if (nums[l] != target) {return res;} else {res[0] = l;}l = 0;r = nums.length - 1;while (l < r) {int mid = (l + r + 1) >> 1;//+1代表确认右边界if (nums[mid] <= target) {l = mid;} else {r = mid - 1;}}res[1] = l;return res;}
4.搜索旋转排序数组No.33

image-20241218171847465

  • 方法一:for循环遍历
public int search(int[] nums, int target) {//for循环遍历for(int i = 0;i<nums.length;i++){if(nums[i]==target){return i;}}return -1;}
  • 方法二:二分 O(logN)
public int search(int[] nums, int target) {int l = 0;int r = nums.length-1;while(l<=r){int mid = (l+r)>>1;if(nums[mid]==target){return mid;}if(nums[l]<=nums[mid]){//左半边有序if(nums[l]<=target&&target<=nums[mid]){r = mid-1;}else{l = mid +1;}}else{//右半边有序if(nums[mid]<=target&&target<=nums[r]){l = mid+1;}else{r = mid - 1;}}}return -1;}
5.寻找旋转排序数组中的最小值No.153

image-20241218180332758

  • 二分
    • 关键在于判断中间值是否大于最右边的值
public int findMin(int[] nums) {int l = 0;int r = nums.length-1;while(l<r){int mid = (l+r)>>1;if(nums[mid]>=nums[r]){//说明小数在右半部分l = mid+1;}else{r = mid;}}return nums[r];}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词