【二分查找】左侧边界、右侧边界、查找值

简介: 【二分查找】左侧边界、右侧边界、查找值


一直以来,搞不清楚关于二分查找的边界问题,不是这里越界,就是那里越界,调试很久也可能A不了,今天,来总结一下关于二分查找

【LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置】

【牛客网-二分查找】

1. 查找特定值

对于查找特定值来说,算是二分法的模板题目吧。

// 常规二分
  public int erFen(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    while (left <= right) {
      int mid = (right - left) / 2 + left;
      if (nums[mid] == target) {
        return mid;
      } else if (nums[mid] < target) {
        left = mid + 1;
      } else if (nums[mid] > target) {
        right = mid - 1;
      }
    }
    return -1;
  }

2. 左侧边界

主要来求一个有序数组中,有重复的数字,让你去找重复数字最左边的边界或者第一个大于该数字的

  • 还是原来的二分套路
  • 当我们遇到目标值target时,向左进行偏移right = mid - 1
  • 最后结束的时候,我们对left的值进行一下判断left >= nums.length || nums[left] != target,防止越界
// 左边界二分
  // 如果当前遇到该值,则往左跑,right = mid - 1;
  public int leftErFen(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    while (left <= right) {
      int mid = (right - left) / 2 + left;
      if (nums[mid] == target) {
        right = mid - 1;
      } else if (nums[mid] < target) {
        left = mid + 1;
      } else if (nums[mid] > target) {
        right = mid - 1;
      }
    }
    // 如果退出循环了,也就是left = right + 1
    // 判断下越界了不
    if (left >= nums.length || nums[left] != target) {
      return -1;
    }
    return left;
  }

3. 右侧边界

主要来求一个有序数组中,有重复的数字,让你去找重复数字最右边的边界

  • 还是原来的二分套路
  • 当我们遇到目标值target时,向右进行偏移left = mid + 1
  • 最后结束的时候,我们对right的值进行一下判断right < 0 || nums[right] != target,防止越界
// 右界二分
  // 如果当前遇到该值,则往左跑,right = mid - 1;
  public int rightErFen(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    while (left <= right) {
      int mid = (right - left) / 2 + left;
      if (nums[mid] == target) {
        left = mid + 1;
      } else if (nums[mid] < target) {
        left = mid + 1;
      } else if (nums[mid] > target) {
        right = mid - 1;
      }
    }
    // 如果退出循环了,也就是left = right + 1
    // 判断下越界了不
    if (right < 0 || nums[right] != target) {
      return -1;
    }
    return right;
  }


相关文章
|
8月前
|
存储 算法 C语言
找到数组位置
找到数组位置
|
8月前
|
索引
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
|
8月前
|
机器学习/深度学习 算法 C++
【算法 | 实验6-1】n*n的网格,从左上角开始到右下角结束遍历所有的方块仅一次,总共有多少种不同的遍历路径
前言 思路介绍中省略了关于如何进行回溯搜索的细节,而主要讨论回溯中所使用的剪枝策略。
173 0
|
存储 C语言 C++
【前缀和】303. 区域和检索 - 数组不可变
【前缀和】303. 区域和检索 - 数组不可变
60 0
|
算法 Python
算法题:把列表右侧 k 位数依次移动到左侧
算法题:把列表右侧 k 位数依次移动到左侧
88 0
|
前端开发 容器
每日一题:如何判断一个元素是否在可视区域中?
每日一题:如何判断一个元素是否在可视区域中?
373 0
每日一题:如何判断一个元素是否在可视区域中?
|
JavaScript API
如何判断元素是否在可视区域内
如何判断元素是否在可视区域内
AcWing 749. 数组的上方区域
AcWing 749. 数组的上方区域
60 0
AcWing 749. 数组的上方区域
AcWing 750. 数组的下方区域
AcWing 750. 数组的下方区域
54 0
AcWing 750. 数组的下方区域
|
存储 索引
区间重叠问题(排序or边界)
区间重叠问题(排序or边界)

热门文章

最新文章