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

中森网站建设公司网站建设歺金手指排名13

中森网站建设公司,网站建设歺金手指排名13,做网站颜色黑色代码多少,北京宣传片二分搜索算法核心-----labuladong笔记 核心思想: 二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些…

二分搜索算法核心-----labuladong笔记

核心思想:

二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且,我们就是要深入细节,比如不等号是否应该带等号mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的二分查找算法。

查找框架:
int binarySearch(vector<int>& nums,int target){int left=0,right=nums.size()-1;while(...){//得到中位数int mid=left+(right-left)/2;//与目标数相同if(nums[mid]==target){...}else if (nums[mid]<target){left=...}else if(nums[mid]>target){right=...}}
}

技巧:不出现else,把所有情况用else if写清楚,可以清楚的展现所有细节。

注意计算 mid 时需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 leftright 太大,直接相加导致溢出的情况。

leecode案例:
一、寻找一个数

搜索一个数,如果存在,返回索引,不存在则返回-1.

class Solution{public://二分搜索框架int search(vector<int>& nums,int target){int left=0;//[left, right]--->right=mid-1int right=nums.size()-1;while(left<=right){int mid=left+(right - left) / 2;//与目标数相同if(nums[mid]==target){return mid;}else if (nums[mid]<target){left=mid+1;}else if(nums[mid]>target){right=mid-1;}}return -1;}
};

为什么while循环的条件是<=不是<?

答:因为初始化 right 的赋值是 nums.length - 1,即最后一个元素的索引,而不是 nums.length

两端都闭的情况[left, right],如果左闭右开[left, right),索引大小为 nums.length 是越界的,所以我们把 right 这一边视为开区间

停止搜索的条件

if(nums[mid]==target){return mid;
}

如果没找到,则while循环停止,返回-1.

终止条件left == right + 1,写成区间的形式就是 [right + 1, right],区间没有任何数字。

缺陷

有序数组 nums = [1,2,2,2,3]target 为 2,此算法返回的索引是 2,没错。但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。

二、寻找左侧边界的二分搜索
int left_bound(vector<int>& nums, int target) {int left = 0;// 注意right是不可取的所以判断条件是left < right//[left, right)--->right=midint right = nums.size();// 注意while (left < right) {int mid = left + (right - left) / 2;//看target在哪个区间if (nums[mid] == target) {right = mid;} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {// target在左边则缩小右边界right = mid;}}return left;
}
  1. target不存在时返回什么?

    答: 如果 target 不存在,搜索左侧边界的二分搜索返回的索引是大于 target 的最小索引。

    如果想让 target 不存在时返回 -1 其实很简单,在返回的时候额外判断一下 nums[left] 是否等于 target 就行了,如果不等于,就说明 target 不存在。需要注意的是,访问数组索引之前要保证索引不越界:

  2. 为什么是 left = mid + 1right = mid?和之前的算法 right = mid-1不一样?

    答:这个很好解释,因为我们的「搜索区间」是 [left, right) 左闭右开,所以当 nums[mid] 被检测之后,下一步应该去 mid 的左侧或者右侧区间搜索,即 [left, mid)[mid + 1, right)

  3. 为什么该算法能够搜索左侧边界?

    可见,找到 target 时不要立即返回,而是缩小「搜索区间」的上界 right,在区间 [left, mid) 中继续搜索,即不断向左收缩,达到锁定左侧边界的目的。

  4. 为什么返回 left ?

    都一样,终止条件为left==right

int left_bound(vector<int>& nums, int target) {int left = 0;//[left, right]--->right=mid-1 ; <=int right = nums.size()-1;// 注意while (left <= right) {int mid = left + (right - left) / 2;//看target在哪个区间if (nums[mid] == target) {//right-1成为区间边界,为了找左边界(单独一个数)right = mid-1;} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {// target在左边则缩小右边界right = mid-1;}}// 注意如果target不存在则返回-1return nums[left] == target ? left : -1;
}

这样就和第一种二分搜索算法统一了,都是两端都闭的「搜索区间」,而且最后返回的也是 left 变量的值。

三、寻找右侧边界的二分查找
int right_bound(vector<int>& nums, int target) {//[left, right]--->right=mid-1 ; <=int left = 0, right = nums.size()-1;while (left <= right) {int mid = left + (right - left) / 2;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+1return nums[left - 1] == target ? (left - 1) : -1;//或者left - 1改成rightreturn nums[right]==target?right:-1;
}

为什么返回left-1?

答:首先,while 循环的终止条件是 left = right+1,所以 left-1 和 right 是一样的,你非要体现右侧的特点,返回 right 好了。

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

相关文章:

  • 化学试剂购买网站免费软件下载网址
  • 甘肃省建设厅职业资格注册中心网站彩票网站如何做
  • 别人能打开的网站我打不开网站建设和管理专业
  • 响应式网站导航怎么做做国外网站要注意什么
  • 适合做网站背景的图片怎么查一个网站是否备案
  • 源码建站教程免费行情软件app下载大全
  • 免费行情软件网站下载ww艺术字体在线生成器毛笔字
  • 网站语言选择江西省赣州市中考分数线2022
  • 宁夏建设职业技术学院成绩查询网站最简单的出入库管理软件
  • 专业网站开发工具更换网站域名 推广
  • wp网站建设教程做旅游网站需要什么
  • 怎样开个人网站大学生创新创业大赛项目计划书
  • 网站 空间深圳外贸公司qc招聘
  • 企业网站建设方案流程成都网站建设哪家专业而且比较便宜
  • 设计游戏的软件seo一个空间建多个网站
  • 东莞h5网站建设做视频包的网站有哪些
  • 网站建设搭建环境浙江省建设注册管理中心网站首页
  • 济南专业网站开发公司如何做自助网站
  • 开源网站官网企业展厅设计公司收费情况
  • 网络营销方案成功案例北京优化网站方法
  • 怎么知道网站哪家公司做的旧宫做网站的公司
  • 做婚礼网站的公司公司主页网站开发
  • 两个网站开发swot分析北京做网站ezhixi
  • 谷歌网站推广好做吗新赣州房产网
  • 和拓者设计吧类似的网站云服务器 可以做网站吗
  • 建设网站情况说明范文深圳推广公司是什么
  • 网站建设计北京商城开发
  • 行业网站建设的开发方案百度推广登录官网
  • 网站黄页推广软件如何自己建设网站
  • 电商网站设计岗位主要是营销型网站建设的五力原则包括