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

国土局网站建设方案2022最火营销方案

国土局网站建设方案,2022最火营销方案,深圳注册公司核名查询,昆山建设招标信息网站前言 在之前的博客中,我给大家介绍了最基础的二分查找法(没学的话点我点我!) 今天我将带大家学习二分法的六种变形如何使用,小伙伴们,快来开始今天的学习吧! 文章目录 1,查找第一个…

前言
在之前的博客中,我给大家介绍了最基础的二分查找法(没学的话点我点我!)

今天我将带大家学习二分法的六种变形如何使用,小伙伴们,快来开始今天的学习吧!
在这里插入图片描述

文章目录

  • 1,查找第一个(从左到右)= 目标值的,若不存在返回 -1
  • 2,查找第一个 >= 目标值的
  • 3,查找第一个 > 目标值的
  • 4,查找最后一个 = 目标值的 ,若不存在返回- 1
  • 5,查找最后一个 <= 目标值的
  • 6,查找最后一个 < 目标值的
  • 总结

1,查找第一个(从左到右)= 目标值的,若不存在返回 -1

与原版二分法其实差不多,当一个数组中有重复的目标值时,使用该方法可以找到从左到右第一个等于目标值的下标。
因为我们要找的是第一个等于目标值的下标,那我们不仅仅在arr[mid] > key时去左边找,在arr[mid]>= key我们也要去找,因为我们需要要最左边等于目标值的下标。
注意事项
最后我们要判断left是否越界(left 有可能等于数组元素的个数),而且最后arr[left]是否等于要找的key。
代码:

int efcz(int* arr, int key,int left,int right)
{int len = right+1;//数组长度(元素个数)int mid = (left + right) / 2;while (left <= right){mid = (left + right) / 2;if (arr[mid] >= key){right = mid - 1;}if (arr[mid] < key){left = mid + 1;}}if (left < len&&arr[left] != key)//判断一下是否找到元素return -1;elsereturn left;
}
int main()
{int arr[10] = { 1,2,3,5,5,5,5,5,5,6 };//创建数组int key = 5;//目标值为5int left = 0;//设置左右起点int right = sizeof(arr) / sizeof(arr[0]);printf("%d", efcz(arr, key,left,right));//进入二分查找函数return 0;
}

2,查找第一个 >= 目标值的

这次我们需要查找第一个大于等于目标值的下标,这次我们不需要判断left越界,如果越界就说明没有找到,说明整个数组都比目标值要小。
代码:

//思路和第一种一样,我就不加注释了,如果不懂可以私信问我
int efcz(int* arr, int key, int left, int right)
{int mid = (left + right) / 2;while (left <= right){mid = (left + right) / 2;if (arr[mid] >= key){right = mid - 1;}if (arr[mid] < key){left = mid + 1;}}return left;
}
int main()
{int arr[10] = { 1,2,3,5,5,5,5,5,6,8 };int key = 7;int left = 0;int right = sizeof(arr) / sizeof(arr[0]);printf("%d", efcz(arr, key, left, right));return 0;
}

3,查找第一个 > 目标值的

这次我们需要查找第一个大于目标值的下标,这次我们同样不需要判断left越界,如果越界就说明没有找到,说明整个数组都比目标值要小。
另外我们需要改变一下函数内部的判断条件,当arr[mid] <= key时,left = mid + 1
因为我们不是要找相等的,是要找大于目标值的。
代码:

//思路和第一种一样,我就不加注释了,如果不懂可以私信问我
int efcz(int* arr, int key, int left, int right)
{int mid = (left + right) / 2;while (left <= right){mid = (left + right) / 2;if (arr[mid] > key){right = mid - 1;}if (arr[mid] <= key){left = mid + 1;}}return left;
}
int main()
{int arr[10] = { 1,2,3,5,5,5,5,5,6,8 };int key = 5;int left = 0;int right = sizeof(arr) / sizeof(arr[0]);printf("%d", efcz(arr, key, left, right));return 0;
}

4,查找最后一个 = 目标值的 ,若不存在返回- 1

因为我们要找的是第一个等于目标值的下标,那我们不仅仅在arr[mid] < key时去右边找,在arr[mid]>= key我们也要去找,因为我们需要要最右边边等于目标值的下标。
注意事项
最后我们要判断right是否越界(right 有可能等于-1),而且最后arr[right]是否等于要找的key。
代码:

//思路和第一种一样,我就不加注释了,如果不懂可以私信问我
int efcz(int* arr, int key, int left, int right)
{int mid = (left + right) / 2;while (left <= right){mid = (left + right) / 2;if (arr[mid] > key){right = mid - 1;}if (arr[mid] <= key){left = mid + 1;}}if (right >= 0 && arr[right] == key)//判断是否找到return right;elsereturn -1;
}
int main()
{int arr[10] = { 1,2,3,5,5,5,5,5,6,8 };int key = 5;int left = 0;int right = sizeof(arr) / sizeof(arr[0]);printf("%d", efcz(arr, key, left, right));return 0;
}

5,查找最后一个 <= 目标值的

这次我们需要查找第一个小于等于目标值的下标,这次我们不需要判断right越界,如果越界就说明没有找到,说明整个数组都比目标值要大。
代码:

//思路和第一种一样,我就不加注释了,如果不懂可以私信问我
int efcz(int* arr, int key, int left, int right)
{int mid = (left + right) / 2;while (left <= right){mid = (left + right) / 2;if (arr[mid] > key){right = mid - 1;}if (arr[mid] <= key){left = mid + 1;}}return right;
}
int main()
{int arr[10] = { 1,2,3,5,5,5,5,5,6,8 };int key = 4;int left = 0;int right = sizeof(arr) / sizeof(arr[0]);printf("%d", efcz(arr, key, left, right));return 0;
}

6,查找最后一个 < 目标值的

这次我们需要查找第一个小于目标值的下标,这次我们同样不需要判断right越界,如果越界就说明没有找到,说明整个数组都比目标值要大。
另外我们也需要改变一下函数内部的判断条件,当arr[mid] >= key时,right = mid - 1,因为我们不是要找相等的,是要找小于目标值的。
代码:

//思路和第一种一样,我就不加注释了,如果不懂可以私信问我
int efcz(int* arr, int key, int left, int right)
{int mid = (left + right) / 2;while (left <= right){mid = (left + right) / 2;if (arr[mid] >= key){right = mid - 1;}if (arr[mid] < key){left = mid + 1;}}return right;
}
int main()
{int arr[10] = { 1,2,3,5,5,5,5,5,6,8 };int key = 5;int left = 0;int right = sizeof(arr) / sizeof(arr[0]);printf("%d", efcz(arr, key, left, right));return 0;
}

总结

我认为可以分两组记忆这六种变形,前三组一类,后三组一类,前三组都是返回left,后三组都是返回right,同时我们会发现,第一种和第四种,第二种和第五种,第三种和第六种都十分的相似,所以自己练练就能掌握,而且不容易忘记,本期的分享就到这里,如果觉得博主讲的不错的话,千万不要忘记给博主一个关注,点赞,收藏哦~,小伙伴们,我们下期再见!


文章转载自:

http://WQAiU0M3.srjgz.cn
http://WwHZeuul.srjgz.cn
http://FEDrHgGm.srjgz.cn
http://iUIjXU3l.srjgz.cn
http://Nu4tiVsz.srjgz.cn
http://SV4CHZ5v.srjgz.cn
http://y6M65wZN.srjgz.cn
http://eGOLzd3x.srjgz.cn
http://ZqTzJ7Xf.srjgz.cn
http://mAO9W3pU.srjgz.cn
http://jzebb9Bg.srjgz.cn
http://gIeJvtsf.srjgz.cn
http://oyQphL8m.srjgz.cn
http://FTRGx21z.srjgz.cn
http://bleOynPU.srjgz.cn
http://qyqhSKzv.srjgz.cn
http://BGLCCDJb.srjgz.cn
http://H4vZkI1R.srjgz.cn
http://cdBX3zcn.srjgz.cn
http://Ehb0u9H3.srjgz.cn
http://WTdNw8IR.srjgz.cn
http://pHShPt2c.srjgz.cn
http://1GA5azWG.srjgz.cn
http://1Ynpd0Hn.srjgz.cn
http://S3fjeHb0.srjgz.cn
http://4XGKgLXB.srjgz.cn
http://aFUVPoQu.srjgz.cn
http://wPtcDiwH.srjgz.cn
http://54pP52WP.srjgz.cn
http://ESns9xJ2.srjgz.cn
http://www.dtcms.com/wzjs/727362.html

相关文章:

  • 我想在阿里巴巴上给别人做网站个人简历wordpress主题
  • 做互联网网站需要什么资质吗5118网站查询
  • 网站静态路径营业推广的概念
  • 网站域名要怎样规划wordpress制作首页模板下载
  • 静态淘宝网站制作模板萨龙wordpress
  • 企业门户网站建设行情网站上传文件存储方式
  • 佛山网站建设锐艺a068帝国cms搭建个人网站
  • 企业网站建设方案案例学做网站培训上海
  • 本地的丹阳网站建设如何修改网站备案
  • 帮别人做网站开票开什么税目工艺宣传网站建设
  • 中小企业网站制作不了WordPress 如何去域名授权
  • 用python语言做网站正邦设计总部都空了
  • 设计公司网站设计详情盘石 网站建设
  • 网站建设的学习方法长安企业建站
  • 怎样保存网站资料做证据建设集团网站公司
  • 西安网站建设熊掌百科网wordpress
  • 明薇通网站建设哪家好wordpress 微博组件
  • 商务网站开发wordpress登录界面怎么编辑
  • 品牌型网站的设计成都网站排名 生客seo怎么样
  • 网站的外链是什么如何增加网站会员
  • 高青县住房和城乡建设局网站北京工商注册app下载
  • 珠海做网站公司有哪些东莞建网站的公司
  • 微信网站对接宁波建设系统网站
  • 网站如何管理常州网站制作公司有哪些
  • 石家庄学做网站建设培训上海中汇建设发展有限公司网站
  • 深圳企业社保网站官网阆中市住房和城乡建设局网站
  • 建设电影网站怎么上传电影设计干货很多的网站
  • 整站优化系统没固定ip怎么做网站
  • 宁陵做网站的公司html免费网站模板带后台
  • 营销类的网站网页设计模板图片简约