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

临沂做进销存网站哈尔滨网络搭建

临沂做进销存网站,哈尔滨网络搭建,wordpress社,企业怎么做网站建设引言 二分搜索是一个说简单也很简单#xff08;代码很固定#xff0c;也没几行#xff09;#xff0c;说难也很难#xff08;边界问题可能会让人想不太清楚#xff09;。 事实上#xff0c;边界问题也是是算法题中普遍存在的难点。 这篇文章讲两个简单的结论#xff0…引言 二分搜索是一个说简单也很简单代码很固定也没几行说难也很难边界问题可能会让人想不太清楚。 事实上边界问题也是是算法题中普遍存在的难点。 这篇文章讲两个简单的结论来轻松解决二分搜索算法中的两个边界问题。 Demo1 /*** 普通二分搜索java实现* 在数组nums中找target。如果能找到返回数组下标。如果找不到返回-1* param nums 搜索对象* param target 目标值* return*/public int search(int[] nums, int target) {int left 0;int right nums.length - 1;while(left right) {int mid left (right - left 1);//等效int mid (left right)/2if (target nums[mid]) {right mid - 1;} else if (target nums[mid]) {left mid 1;} else {return mid;}}return -1;}这是二分搜索最基础的一段代码。 虽然很简单但这却是所有二分搜索的基本逻辑。大部分变体都和上面这段代码大差不差。 但其中的边界问题需要想清楚。 循环边界问题 定义右指针时右边界是开还是闭 int right nums.length; or int right nums.length - 1;循环要不要等号 while(left right) or while(left right) 这里给一个一劳永逸的答案就按照上面的demo选择左闭右闭 原因很简单两边都有效最容易思考。 当选择左闭右闭后while循环就得加上等号 因为如果选择不加等号假如数组里只有一个元素此时根本无法进入while循环。 Demo2 给定一个排序数组和一个目标值在数组中找到目标值并返回其索引。 如果目标值不存在于数组中返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。这个题也不难很多人都能做出来。 但多少人能肯定自己在做这个题时候没有“猜”的成分 可以肯定的给出一个让人信服且易于理解的解释。 循环结束两个指针停在哪里 这个题可以分为两部分 能找到target就像demo1那样通过mid匹配上target然后直接返回。此时我们确实不需要关心最后左右指针停在哪里如下图所示mid直接找到了绿色的target target不存在。这是这个题的关键难点所在。 虽然我们大致知道写出来的最终代码和上面的demo区别依然不大但是是1还是-1是谁1left1 right1 or mid1这个边界问题就有点让人头疼了。 假如我们知道左右指针最终停的位置这个问题就会被大大简化。 直接给出结论左右指针停在“这个不存在的target”的右左两边。如下图所示 绿色的target并不存在也就是说两个指针其实是前后挨着的中间并没有元素只不过 左指针在右边右指针在左边。 依据这样一个简单的结论解决上面的问题就很简单了一目了然当target不存在时left指针的位置就是大于target的最小值。 Demo2答案 public int searchInsert(int[] nums, int target) {int start 0;int end nums.length-1;while (start end) {int mid ((end - start) 1) start;if (nums[mid] target) {return mid;} else if (nums[mid] target) {end mid - 1;} else {start mid 1;}}return start;}根据这个直观的直观的简单结论还可以轻松解决很多二分搜索是变体问题。 注意两端别越界 target比最小的值还小时 此时right就越界了。如果最终要使用right可能就需要先判断一下。target比最大的值还大 此时left越界同样在使用时要注意判断。 其实Demo2返回的就是left为什么不担心越界 因为题目的要求是 如果目标值不存在于数组中返回它将会被按顺序插入的位置 如果target很大超过了所有值需要返回的就是n。 为什么 通过观察Demo的执行逻辑我们可以发现。 如果target不存在必然会循环到结束。而在最后一次循环中当leftright此时两个指针所在的值 无论比target大还是比 target小下一步肯定有一个指针要再挪动一步。如图所示 总结 二分法固定写法左闭右闭while加等号当target不存在时左右指针最终停在“target的右左两边”
http://www.pierceye.com/news/163150/

相关文章:

  • 多用户自助建站系统wordpress修改生效
  • 免费学编程国内网站珠海网站建设 科速
  • 网站制作公司兴田德润简介福州公司做网站
  • 织梦网站图标路径上海网站推广
  • 网站亚马逊商城
  • h5企业模板网站模板江苏专业网站建设公司电话
  • 手机网站建设怎么样企业官网建设的重要性
  • 笑话小网站模板html网站制作标准
  • 大连网站建设哪家专业图片识别搜索引擎
  • 营销网站制作企业邓州市建设局网站
  • 如何从客户网站开发客户请解释网站开发的主要流程.
  • 做网站的价格 外贸最好科技广州网站建设
  • 烟台开发区网站做网站诊断步骤
  • 成都网站建设哪家技术好关于做网站的搞笑段子
  • 网站的设计制作流程计算机网站开发要考什么证
  • 个人域名 公司网站百度推广和网站建设
  • 哪里有做网站服务抖音开放平台是什么
  • 公司网站上传不了图片建设网站条件
  • 精美公司网站源码婚礼策划网站设计
  • 线上设计师网站网络维护是什么意思
  • 培训网站建设阿里云如何建设网站
  • 手机网站列表模板做一钓鱼网站吗
  • 太原网站建设方案策划请问有重庆有做网站吗
  • 网站备案购买语音网站怎么做
  • ftp上传文件到网站深圳成品网站超市
  • 网站开发时app打开很慢建设网站还要云服务器吗
  • 网站设计方案应该怎么做网站自适应开发
  • 徐州手机网站设计青龙县建设局网站
  • 罗湖网站建设费用帮忙做文档的网站
  • 如何在720云网站做全景视频域名注册网站查询工具