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

做网站开发学什么/seo搜索引擎优化方法

做网站开发学什么,seo搜索引擎优化方法,南桥网站建设,包头做网站公司文章目录题目解题思路代码实现(C)二分查找扩展题目 题目来源:leetcode 剑指Offer 11:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最…

文章目录

  • 题目
  • 解题思路
  • 代码实现(C++)
  • 二分查找
  • 扩展

题目

题目来源:leetcode 剑指Offer 11:旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
示例1:

输入: [3,4,5,1,2]
输出: 1

示例2:

输入: [2,2,2,0,1]
输出: 0

示例3:

输入: [2,3,5]
输出: 2

解题思路

旋转前的数组是单调不减的,旋转后的数组会出现0个(将数组中的前0个元素移动到后面)或1个断崖。若没有断崖,数组中第一个元素就是最小值;若有,旋转后的数组仅在断崖处是递减的,且较小值(崖底)是数组的最小值。
没有断崖:
0个断崖
有断崖:
1个断崖
使用二分查找在数组numbers下标[left..right]序列内寻找断崖(或判断是否存在断崖)。如果中间元素numbers[mid] < numbers[mid - 1],则mid对应着数组的最小值。
如果numbers[mid]大于numbers[right],说明断崖在右半部。
在右半部查找
如果numbers[mid]小于numbers[right],说明断崖在左半部。
在这里插入图片描述
如果numbers[mid] == numbers[right],则无法判断断崖的位置,需要将right1,重新做判断。
断崖在右半部:
无法判断断崖的位置
断崖(最小值)在左半部:
在这里插入图片描述
如果left > right时还未找到最小值,该数组无断崖。

代码实现(C++)

int minArray(vector<int>& numbers) {if (numbers.size() < 2) {return numbers.front();}int left = 0;int right = numbers.size() - 1;// 二分查找while (left <= right) {int mid = left + ((right - left) >> 1);// 找到了断崖if (mid > 0 && numbers[mid] < numbers[mid - 1]) {return numbers[mid];}if (numbers[mid] == numbers[right]) {--right;}else if (numbers[mid] < numbers[right]) {right = mid - 1;}else {left = mid + 1;}}// 没有断崖// 使用"return numbers[left];"语句也能通过所有的测试用例return numbers.front(); }

以下代码也能通过所有的测试用例。

class Solution {
public:int minArray(vector<int>& numbers) {if (numbers.size() < 2) {return numbers.front();}int left = 0;int right = numbers.size() - 1;while (left < right) { // 去掉了=符号int mid = left + ((right - left) >> 1);if (mid > 0 && numbers[mid] < numbers[mid - 1]) {return numbers[mid];}if (numbers[mid] == numbers[right]) {--right;}else if (numbers[mid] < numbers[right]) {right = mid - 1;}else {left = mid + 1;}}return numbers[left]; }
};

二分查找

如果在数组下标[left..right]范围内根据某种要求进行二分查找,笔者原以为while循环控制条件left < rightleft <= right是等价的,只要最后return left,那结果就是正确的。通过本题可知,在旋转的有序数组上进行二分查找时循环控制语句left < rightleft <= right是等价的。
但事实上,如果循环控制条件是left < right,当left == right时退出循环,而此时left所对应的元素未必满足要求。因此正确的循环控制条件应该是left <= right
例如要在数组nums=[1,3,5]中找到第一个大于等于2的元素,开始left = 0,right = 2,mid = 1,因为nums[1]符合要求,因此将right置为0,此时left == right。如果循环控制语句是left < right,那将返回nums[0],得到错误的结果;如果循环控制语句是left <= right,那将进一步对nums[0]进行判断,最后返回nums[1],结果正确。
由此可见,分别在正常的有序数组和旋转后的有序数组上使用二分查找时,两者有一些微妙的区别。

扩展

要在旋转的有序数组上进行查找操作,二分查找是首先要考虑的方法。但由于旋转数组是局部有序的,所以要区分有序段和无序段(存在断崖),还要注意出现重复元素。
leetcode 面试题10.03:搜索旋转数组是在旋转数组中搜索第一个出现的元素,除了二分查找,还用到了递归的思路。

http://www.lbrq.cn/news/1754281.html

相关文章:

  • 网站开发与维护竞赛/免费发布广告信息的网站
  • 网站上怎么做企业推广/武汉百度seo网站优化
  • 欧美 电台 网站模板/深圳网络推广招聘
  • 东山县建设局网站/友情链接交换平台有哪些
  • 用网站空间可以做有后台的网站吗/狼雨的seo教程
  • 企业做淘宝客网站有哪些/郑州seo外包服务
  • 马云做网站最早/软文代写兼职
  • 零售商城/百度排名优化
  • 长沙建网站/怎么做微信推广和宣传
  • 有哪些网站是用vue做的/百度首页
  • 生产企业做网站的费用怎么做账/百度指数什么意思
  • 泰州建设工程信息网/朝阳区seo搜索引擎优化介绍
  • 上海网站托管/起名最好的网站排名
  • 馨端网站建设/郑州网站seo
  • 为网站做推广/2022适合小学生的简短新闻
  • 本地的沈阳网站建设/开鲁网站seo不用下载
  • 我的世界手机做图的网站/网络推广关键词优化公司
  • 能免费做婚礼邀请函的网站/排名优化推广
  • 蓬莱网站建设公司报价/网站seo完整seo优化方案
  • 2345网址导航浏览器主页/北京seo百科
  • 网站开发初学/semir森马
  • 做网站江西/郑州网站建设公司排名
  • 网站文章做排名/宁波正规优化seo软件
  • 做网站公司名字/杭州网络优化公司排名
  • 九江市建设局官方网站/互联网精准营销
  • 15年做哪个网站能致富/网站关键词排名快速提升
  • 做婚纱网站的图片素材/昆明seo
  • 昆明网站建设费用/广告推广文案
  • 自己做网站app/南宁seo服务优化
  • 潍坊企业网站模板建站/搜狗网页版
  • 搭建比分网服务器怎么选数据不会卡顿?
  • CSS篇——第一章 六十五项关键技能(上篇)
  • 【Linux服务器】-MySQL数据库参数调优
  • ROS2 通过相机确定物品坐标位置
  • Word快速文本对齐程序开发经验:从需求分析到实现部署
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十一课——高斯下采样后图像还原的FPGA实现