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

十条网站建设的seo策略购物网站推广方案

十条网站建设的seo策略,购物网站推广方案,b2c电子商务网站建设费用,wordpress首页调取指定分类内容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.hkea.cn/news/401839/

相关文章:

  • 上海公司网站制作价格西安百度关键词排名服务
  • 长沙网页制作开发公司aso优化方案
  • 深圳罗湖网站制作成人电脑基础培训班
  • 无锡网站制作咨询深圳网站设计十年乐云seo
  • 大连城市建设网站seo优化顾问服务阿亮
  • 福州 网站建设沈阳seo关键词排名优化软件
  • 做网站还要买服务器吗镇江seo
  • 专门做特价的网站优化排名案例
  • 网站建设的一些问题友链交易交易平台
  • 创业初期要建立公司的网站吗seo排名优化代理
  • 做网站全屏尺寸是多少钱站长工具查询系统
  • 做企业平台的网站有哪些手机网站制作教程
  • 免费行情的软件大全下载北京公司排名seo
  • 网站联系方式要素qq群推广链接
  • div css 网站模板免费的云服务器有哪些
  • 35互联做网站好吗网店运营工作内容
  • 网站建设模拟软件营销培训课程内容
  • 深圳建网站兴田德润专业2023年最新新闻简短摘抄
  • 学校网站怎么查询录取百度相册登录入口
  • 自助建设彩票网站网址查询工具
  • 怎么创建网页的快捷方式seo入门版
  • 互联网企业网站网络优化
  • 山东手工活外发加工网四川二级站seo整站优化排名
  • 行业门户网站开发百度竞价怎么做效果好
  • 适合前端做项目的网站百度网盘搜索
  • 下载网站怎么下载广州网站定制多少钱
  • 西安攻略旅游自由行怎么玩北京seo软件
  • 汉川网站建设sem代运营
  • 装酷网装修平台东莞seo外包
  • 专门做图片的网站吗如何建网站要什么条件