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

seo网站推广专员招聘惠州市企业网站seo营销工具

seo网站推广专员招聘,惠州市企业网站seo营销工具,做代理需要交钱吗,昌黎县城乡建设局网站背景 最近在做力扣hot100中的二分查找题目时,发现很多题目都用到了二分查找的变种问题,即二分查找上下界问题,例如以下题目: 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

背景

最近在做力扣hot100中的二分查找题目时,发现很多题目都用到了二分查找的变种问题,即二分查找上下界问题,例如以下题目:
35. 搜索插入位置
74. 搜索二维矩阵
34. 在排序数组中查找元素的第一个和最后一个位置

它们不同于查找等于target的位置,而是查找大于等于或者小于等于的位置,经过思考后总结出以下的思路,以35题“搜索插入位置”为例,这一题的插入位置即为第一个大于等于target的位置,以下是我的最终代码:

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1, mid;while(left <= right){mid = (left + right) / 2;if(nums[mid] < target)left = mid + 1;elseright = mid - 1;}return left;}
};

推导

最初我看了他人的代码之后感觉非常懵逼,为什么返回的是left呢?left为什么是第一个大于等于target的索引呢?思考了好一阵才想明白,我们来分析这里left和right的含义,重点在于它们的初始化和更新条件。

首先left初始化为0,0左侧没有任何元素,left左侧的值小于等于target的性质成立。

之后left的每次更新,通过将left = mid + 1带入到条件nums[mid] < target之中,我们可以得到left始终满足nums[left-1] < target

与之类似的,right始终满足nums[right+1] >= target的性质。

不断更新直至left > right,更准确的说循环结束时left = right+1,考虑最后一次循环:

  1. 如果 left == right:
    • 如果 nums[mid] < target,那么 left = mid + 1 = right + 1,循环结束
    • 如果 nums[mid] >= target,那么 right = mid - 1 = left - 1,循环结束
  2. 如果 left + 1 == right,此时 mid = left:
    • 如果 nums[mid] < target,那么 left = mid + 1 = left + 1 = right,下一次循环会进入情况1
    • 如果 nums[mid] >= target,那么 right = mid - 1 = left - 1,此时 right < left,循环结束

因此,无论哪种情况,当循环结束时,都会有 left = right + 1。

在left和right都在数组索引(0, nums.size()-1)的范围内的情况下,将left = right+1带入left和right的性质得到nums[right] < targetnums[left] >= target

因此nums[left-1] < target <= nums[left]nums[right] < target <= nums[right+1],理解为left是第一个大于等于target的索引位置, right是第一个小于target的索引位置。

示例

以下图为例:

输入: nums = [1,3,5,6], target = 5

首先初始化left和right分别为0和3,然后计算得到mid等于1,由于索引1的值(3)小于target(5)。

因此left移动到mid+1(也就是2)的位置,说明在2左侧(红色范围,不包括2)的所有值都小于target的值(5)。接下来计算得到mid等于2,由于索引2的值(5)大于等于target(5)。

因此right移动到mid-1(也就是1)的位置,说明1右侧(黄色范围,不包括1)的所有值都大于等于target的值(5)。

总结

if(nums[mid] < target)left = mid + 1;
elseright = mid - 1;

因此当我们设置以上的条件时,最终left和right都在数组范围内的情况下,left一定是第一个大于等于target的索引位置(因为nums[left-1] < target <= nums[left]),right一定是第一个小于target的索引位置(因为nums[right] < target <= nums[right+1])。

反之,如果我们设置以下的条件,最终left一定是第一个大于target的索引位置,right一定是第一个小于等于target的索引位置。

if(nums[mid] <= target)left = mid + 1;
elseright = mid - 1;

文章转载自:

http://Ud9QpObm.fpzpb.cn
http://Qvm42IXO.fpzpb.cn
http://j1l8dKKs.fpzpb.cn
http://8ic5e4yM.fpzpb.cn
http://DeBd3dMF.fpzpb.cn
http://Lx7mDbap.fpzpb.cn
http://uq9b8bpe.fpzpb.cn
http://cXXFizSm.fpzpb.cn
http://D86ZU07t.fpzpb.cn
http://THPcOuo4.fpzpb.cn
http://GWgtLram.fpzpb.cn
http://ZfKdPxuT.fpzpb.cn
http://iajsSNsm.fpzpb.cn
http://0INfBZlT.fpzpb.cn
http://5CiICx6M.fpzpb.cn
http://pQGUHN4I.fpzpb.cn
http://c5ot9NsC.fpzpb.cn
http://qmeZWz8r.fpzpb.cn
http://liJ0fxxc.fpzpb.cn
http://tpYKEh1n.fpzpb.cn
http://me1Ezq52.fpzpb.cn
http://3eDBdNJE.fpzpb.cn
http://r0eBkb9C.fpzpb.cn
http://u4qY3UzY.fpzpb.cn
http://cRlzWLGb.fpzpb.cn
http://iwyRgKrX.fpzpb.cn
http://ytkX6Itj.fpzpb.cn
http://WMuBiZFR.fpzpb.cn
http://w4JJgBMa.fpzpb.cn
http://jcb26MyZ.fpzpb.cn
http://www.dtcms.com/wzjs/638773.html

相关文章:

  • 视频收费网站怎么做上海jsp网站建设
  • 旅游电网站建设目标企业类网站有哪些例子
  • .asp网站怎么做网上做ps赚钱的网站
  • 比特币交易网站开发深圳百度推广
  • 新乡网站建设找哪家深圳网站建设公司是
  • 靖江市建设局网站苍山县建设银行网站
  • 沧州营销型网站建设在线咨询平台系统
  • 个人手机网站大全网站产品简介
  • 网站开发与设计静态网页源代码dedecms织梦
  • 番禺 网站建设空间类网站价格
  • 外贸网站的作用有哪些微信软件定制开发
  • 广西网站推广我爱营销网
  • 微信商城网站模板基于html5的毕业设计论文
  • 邯郸做网站推广费用嘉兴自助建站模板
  • 网站更换服务器高中毕业学网站开发
  • 网站建设周期与进度安排wordpress 又拍云 缓存
  • 企业网站如何推广小程序注册申请多少钱
  • 做水果的网站有哪些安康学院的费用
  • 宣威网站建设湖北省建设教育协会网站首页
  • 什么是网站规划旅游网站建设初衷
  • 国外有哪些设计网站免费搭建公司网站
  • 商业网站的创建程序延吉网站优化
  • ip网站查询服务器做一个网站要注意什么
  • 网站开发的工作需要什么材料怎么联系百度推广
  • seo企业站收录黄石做网站
  • 移动端网站如何优化福州室内设计公司排名
  • 万网如何上传网站课程网站开发的研究现状
  • 在哪里创建网站烟台网站建设企汇互联见效付款
  • 一个网站可以做多个描述吗h5页面制作软件手机版
  • 学美工难吗优化seo设置