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

上海建设局网站网站建 设方案说明书

上海建设局网站,网站建 设方案说明书,新华网,物联网的核心和基础是什么1)题目描述: 2)本题要求使用 时间复杂度O(log n)的算法,这里使用二分查找的方法,这道题本身不复杂,但是,在使用递归调用时,笔者经常把递归结束的边界搞错,这里给出几版代…

1)题目描述:

2)本题要求使用 时间复杂度O(log n)的算法,这里使用二分查找的方法,这道题本身不复杂,但是,在使用递归调用时,笔者经常把递归结束的边界搞错,这里给出几版代码,做一下讨论

第1版代码:

class Solution {
public:int findMid(vector<int>& nums, int l, int r, int target) {int mid = (l+r)/2;if(nums[mid] == target) {return mid;}else if(l == r) {if(nums[mid] < target) {return mid+1;}else {return mid;}}else if(l > r) {// array is [3, 5, 7, 9, 10], target=8// ...// l=3, r=4  m=3   nums[mid]>target// l=3, r=2  m=2// when l > r, just return lreturn l;}else {if(nums[mid] < target) {l = mid + 1;}else {r = mid - 1;}}return findMid(nums, l, r, target);}int searchInsert(vector<int>& nums, int target) {return findMid(nums, 0, nums.size()-1, target);}
};

这里需要注意的一点是,如果需要继续二分查找,则需要更新左右边界,笔者直觉上认为,如果nums[mid] < target,将左边界更新为mid+1,如果nums[mid] > target,将右边界更新为mid-1,但是在实际执行程序时,这样做可能会出现左边界>右边界的情况,程序进入无限循环,如下图所示:

所以在原始代码的基础上增加了对于"左边界>右边界的情况"的简单处理,当然了,之所以可以简单处理,是因为出现这种情况时,搜索插入位置可以确定了。

第2版代码:

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

在第1版代码的基础上,笔者在想,是否可以避免"左边界>右边界的情况",同时为了要找到插入位置,还要不断地缩小搜索空间,在上面列举的出现"左边界>右边界的情况"的例子中,最后,l=3,r=4,m=3,最后nums[mid]>target,需要将r更新为mid-1,那么这里我们可以做保守处理,将r更新为mid。如果l与r相同,代码做了详尽处理。l=mid+1、r=mid-1的边界更新策略就是没有很好地处理l+1=r的情况,这里检查一下l=mid+1、r=mid的边界更新策略是否能处理r-l=1的情况。如果r-l=1,则mid=(l+l+1)/2=l,如果nums[mid]=target,则搜索插入位置是mid,如果nums[mid]<target,则l保持不变,r更新为mid(上一步的l),如果nums[mid]>target,则l更新为mid+1(上一步的l+1),r保持不变。如果r-l>1,在不断地缩小搜索空间后,总会进入到l=r或r-l=1的情况。

第3版代码:

class Solution {
public:int findMid(vector<int>& nums, int l, int r, int target) {int mid = (l+r)/2;if(mid*2+1 == l+r) {mid++;}if(nums[mid] == target) {return mid;}else if(l == r) {if(nums[mid] < target) {return mid+1;}else {return mid;}}else {if(nums[mid] < target) {l = mid;}else {r = mid - 1;}}return findMid(nums, l, r, target);}int searchInsert(vector<int>& nums, int target) {return findMid(nums, 0, nums.size()-1, target);}
};

这里将第3版代码与第2版做对比,讨论mid与左右边界的关系、以及左右边界的更新策略,当l+r不能整除时,(l+r)/2取下整,举个例子,如果l=3,r=4,则mid应该是3.5,当然计算机默认策略是取下整3,是小于3.5的一个整数,所以在r-l=1时,l与mid是重合的,如果是左边界更新,可以将其更新为mid+1,向右边界靠近,如果是右边界更新,只能将其更新为mid(如果更新为mid-1,则可能出现左边界>右边界的情况),也可以理解,mid=(l+r)/2可能在左右边界的中间位置,也有可能偏左。第3版代码就是在(l+r)不能整除2的情况下,让mid偏右,这时左右边界的更新策略可以改为l=mid,r=mid-1。

4)关于递归,要仔细考虑到自己的代码最后结束的情况有哪几种,这样才能避免未预期的情况。

http://www.yayakq.cn/news/498205/

相关文章:

  • 网站水印设置作教程苏州智能网站建设
  • 空间做子网站网搜网
  • 青岛网站建设哪个好wordpress 调取缩略图
  • 洛阳制作网站的公司吗济南智能网站建设费用
  • 行业网站盈利模式e4a做网站
  • 个体工商户网上年检济南网络优化公司
  • 网站建设活动计划市场监督管理局投诉电话是多少
  • 优秀网站建设报价网站开发编程入门学习
  • 做图专业软件下载网站有哪些网站开发的一般流程
  • 做信息发布类网站用什么语言网站后台管理系统用什么软件做
  • 用花生棒自己做网站简单的网站模板
  • 网站研发东莞网站开发定制
  • 旧电脑做网站服务器深圳专业画册设计机构
  • 网站制作百度网盘弱电工程公司网站怎么做
  • 湘潭网站建设 找磐石网络一流西安博达网站建设
  • 智联招聘网站怎么做两份简历模板域名绑定网站需要多久
  • 制作网站需要wordpresswix做的网站在国内访问不
  • 免费的网站推广软件下载网站电脑版和手机版区别
  • 1688阿里巴巴国际站首页网站建设全程揭秘 课件下载
  • 提升网站开发效率优化模型有哪些
  • 长沙 建网站网站建设编辑教程
  • 哈尔滨网站公司网站想改版 权重
  • 网站备案链接直接查看百度云wordpress怎么搭建网站
  • 建网站 备案苏州互联网企业排名
  • 营销型网站的建设要求都有什么前端工作6年一般拿多少工资
  • 网站审批号小说网站开发项目简介
  • 做一个回收网站怎么做有什么好的网站
  • flash网站建设技术...长沙圭塘网站建设公司
  • 做网站的图片传进去很模糊如何用虚拟主机建设网站
  • 企业网站哪家做的好静态网页模板制作工具