当前位置: 首页 > wzjs >正文

机械网站开发方案新闻早知道

机械网站开发方案,新闻早知道,专门做男装的网站,中山移动网站设计公司二分查找算法精讲 二分查找原理&闭区间写法34. 在排序数组中查找元素的第一个和最后一个位置关键的对与区间的定义 代码 左闭右开区间写法代码 开区间写法(最推荐)代码 如何处理不是> 的情况 资料来源 二分查找红蓝染色法https://www.bilibili.co…

二分查找算法精讲

  • 二分查找原理&闭区间写法
    • 34. 在排序数组中查找元素的第一个和最后一个位置
      • 关键的对与区间的定义
    • 代码
  • 左闭右开区间写法
    • 代码
  • 开区间写法(最推荐)
    • 代码
  • 如何处理不是>= 的情况

资料来源 二分查找红蓝染色法https://www.bilibili.com/video/BV1AP41137w7?vd_source=02eff3861fbae92e5089ad13f3b33f20&spm_id_from=333.788.videopod.sections

二分查找原理&闭区间写法

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

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

在这里插入图片描述

关键的对与区间的定义

关键:🔴牢牢记住这个区间的定义,是解题的关键!【补充】理解二分,请牢记区间的定义!区间内的数(下标)都是还未确定与 target 的大小关系的,有的是 < target,有的是 ≥ target;区间外的数(下标)都是确定与 target 的大小关系的。

在这里插入图片描述
在这里插入图片描述

代码

class Solution {public int[] searchRange(int[] nums, int target) {int start = lowerBound(nums, target);if (start == nums.length || nums[start] != target) {return new int[]{-1, -1}; // nums 中没有 target}// 如果 start 存在,那么 end 必定存在int end = lowerBound(nums, target + 1) - 1;return new int[]{start, end};}// lowerBound 返回最小的满足 nums[i] >= target 的下标 i// 如果数组为空,或者所有数都 < target,则返回 nums.length// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]private int lowerBound(int[] nums, int target) {int left = 0;int right = nums.length - 1; // 闭区间 [left, right]while (left <= right) { // 区间不为空// 循环不变量:// nums[left-1] < target// nums[right+1] >= targetint mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1; // 范围缩小到 [left, mid-1]} else {left = mid + 1; // 范围缩小到 [mid+1, right]}}// 循环结束后 left = right+1// 此时 nums[left-1] < target 而 nums[left] = nums[right+1] >= target// 所以 left 就是第一个 >= target 的元素下标return left;}
}

左闭右开区间写法

代码

class Solution {public int[] searchRange(int[] nums, int target) {int start = lowerBound(nums, target);if (start == nums.length || nums[start] != target) {return new int[]{-1, -1}; // nums 中没有 target}// 如果 start 存在,那么 end 必定存在int end = lowerBound(nums, target + 1) - 1;return new int[]{start, end};}// lowerBound 返回最小的满足 nums[i] >= target 的下标 i// 如果数组为空,或者所有数都 < target,则返回 nums.length// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]private int lowerBound(int[] nums, int target) {int left = 0;int right = nums.length; // 左闭右开区间 [left, right)while (left < right) { // 区间不为空// 循环不变量:// nums[left-1] < target// nums[right] >= targetint mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid; // 范围缩小到 [left, mid)} else {left = mid + 1; // 范围缩小到 [mid+1, right)}}// 循环结束后 left = right// 此时 nums[left-1] < target 而 nums[left] = nums[right] >= target// 所以 left 就是第一个 >= target 的元素下标return left;}
}

开区间写法(最推荐)

代码

class Solution {public int[] searchRange(int[] nums, int target) {int start = lowerBound(nums, target);if (start == nums.length || nums[start] != target) {return new int[]{-1, -1}; // nums 中没有 target}// 如果 start 存在,那么 end 必定存在int end = lowerBound(nums, target + 1) - 1;return new int[]{start, end};}// lowerBound 返回最小的满足 nums[i] >= target 的下标 i// 如果数组为空,或者所有数都 < target,则返回 nums.length// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]private int lowerBound(int[] nums, int target) {int left = -1;int right = nums.length; // 开区间 (left, right)while (left + 1 < right) { // 区间不为空// 循环不变量:// nums[left] < target// nums[right] >= targetint mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid; // 范围缩小到 (left, mid)} else {left = mid; // 范围缩小到 (mid, right)}}// 循环结束后 left+1 = right// 此时 nums[left] < target 而 nums[right] >= target// 所以 right 就是第一个 >= target 的元素下标return right;}
}

如何处理不是>= 的情况

在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/wzjs/504931.html

相关文章:

  • 薅羊毛做任务赚钱网站最新推广方法
  • 做职业测评的网站盘多多网盘搜索
  • 政府网站建设的易用性网站建设深圳公司
  • 郑州网站个人开发网站推广优化方法
  • 中国的网站建设数据分析宁波网站推广怎么做
  • 响应式装饰设计公司网站源码怎么关闭seo综合查询
  • 如何自己做外贸网站友情链接的网站图片
  • 做数据权威的网站有哪些仓山区seo引擎优化软件
  • 检测网站是否为WordPress谷歌是如何运营的
  • 北京住房和城乡建设官方网站关键字搜索软件
  • 前端电商网站开发周期友情链接查询友情链接检测
  • 自动做任务赚钱的网站手机百度下载免费
  • 郑州网络兼职网站建设北京seo排名优化网站
  • 做电影网站都需要什么手续疫情二十条优化措施
  • 甘肃省酒泉市做网站公司合肥网站快速优化排名
  • 怎么做购物平台网站关键词排名技巧
  • 保定建行网站首页登录优化设计数学
  • 一台虚拟主机能建设几个网站医院线上预约
  • js弹出网站软件开发公司网站
  • 17. 整个网站建设中的关键是今日头条搜索优化
  • c 网站开发 视频教程百度广告搜索引擎
  • 深圳建网站开发费用重庆seo网站
  • 做网站需要视频衔接怎么做免费正规的接单平台
  • 深圳南山做网站的公司短视频代运营合作方案
  • eclips怎么做网站广告招商
  • 杨凌网站建设抚顺网站seo
  • phpcmsv9网站建设入门教程济南百度开户电话
  • 做网站哪里学网站建设报价明细表
  • 网站建设服务合同范本下列关于友情链接说法正确的是
  • 学会了php的语法怎么做网站关键词优化软件哪家好