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

网站做的不满意搜索引擎网站排名优化方案

网站做的不满意,搜索引擎网站排名优化方案,建筑作品集网站代做,龙岩几个县题目 153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode) 思路 旋转排序数组有一个关键特性:将一个排序数组在某个位置旋转后,会形成两个排序子数组,而最小值正好是第二个子数组的第一个元素。 使用二分查找来定位…

题目

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

思路

旋转排序数组有一个关键特性:将一个排序数组在某个位置旋转后,会形成两个排序子数组,而最小值正好是第二个子数组的第一个元素。

使用二分查找来定位旋转点(最小值)。关键是比较中间元素与右边界元素的大小关系,根据比较结果确定最小值在哪个半区。

判断依据

如果 nums[mid] > nums[right]:

  • 说明中间元素位于第一个递增子数组
  • 最小值一定在 mid 右侧
  • 更新 left = mid + 1

如果 nums[mid] < nums[right]:

  • 说明中间元素位于第二个递增子数组
  • 最小值可能是 mid 或在 mid 左侧
  • 更新 right = mid

如果 nums[mid] == nums[right]:

  • 在本题中(无重复元素),这种情况只会出现在 mid == right
  • 将其归入第二种情况处理

算法步骤

初始化左右指针:left = 0, right = nums.size() - 1

当 left < right 时循环:

  • 计算中点:mid = left + (right - left) / 2
  • 比较 nums[mid] 与 nums[right]
  • 根据比较结果更新 left 或 right

循环结束时,left == right,指向最小值

返回 nums[left]

过程

以数组 [4, 5, 6, 7, 0, 1, 2] 为例:

初始状态:

索引:  0  1  2  3  4  5  6
数组: [4, 5, 6, 7, 0, 1, 2]↑           ↑        ↑left        mid      right

 第一次迭代:

  • mid = 3, nums[mid] = 7, nums[right] = 2
  • 7 > 2,说明最小值在右半部分
  • 更新 left = mid + 1 = 4
索引:  0  1  2  3  4  5  6
数组: [4, 5, 6, 7, 0, 1, 2]↑  ↑  ↑left mid right

 第二次迭代:

  • mid = 5, nums[mid] = 1, nums[right] = 2
  • 1 < 2,说明最小值在左半部分(包括mid)
  • 更新 right = mid = 5
索引:  0  1  2  3  4  5  6
数组: [4, 5, 6, 7, 0, 1, 2]↑  ↑left rightmid

 第三次迭代:

  • mid = 4, nums[mid] = 0, nums[right] = 1
  • 0 < 1,说明最小值在左半部分(包括mid)
  • 更新 right = mid = 4
索引:  0  1  2  3  4  5  6
数组: [4, 5, 6, 7, 0, 1, 2]↑leftrightmid

 

循环结束:

  • left == right == 4
  • 返回 nums[4] = 0

特殊情况

如果数组没有旋转(例如 [1, 2, 3, 4, 5]),算法仍然有效:

  • nums[mid] 始终小于 nums[right]
  • right 会不断向左移动
  • 最终 left == right == 0,返回 nums[0]

时间复杂度

O(log n) - 二分查找的标准时间复杂度

空间复杂度

O(1) - 只使用常数额外空间

读者可能的错误写法

class Solution {
public:int findMin(vector<int>& nums) {int left = 0;int right = nums.size()-1;while(left <= right){int mid = left + (right - left)/2;if(nums[mid] > nums[right]){left = mid +1;}if(nums[mid] < nums[right]){right = mid -1;}if(nums[mid] == nums[right]){return mid;}}return right;}
};

逻辑结构错误:你使用了三个独立的 if 语句,而不是 if-else if-else 结构。这意味着多个条件可能会同时执行,导致错误的更新。

错误的终止条件:当 nums[mid] == nums[right] 时,直接返回 mid。但这并不一定是最小值,特别是在有重复元素的情况下。

循环结束逻辑:使用 left <= right 作为循环条件,但循环结束后返回 right 可能不正确。

查找策略错误:当 nums[mid] < nums[right] 时,你排除了 mid(设置 right = mid - 1),但实际上 mid 可能就是最小值。

或者这样的错误写法

class Solution {
public:int findMin(vector<int>& nums) {int left = 0;int right = nums.size()-1;while(left < right){int mid = left + (right - left)/2;if(nums[mid] > nums[right]){left = mid +1;}if(nums[mid] < nums[right]){right = mid;}}return right;}
};

你使用了两个独立的 if 语句,而不是 if-else 结构。这可能导致逻辑错误,特别是当 nums[mid] == nums[right] 的情况没有被处理。

正确的写法

class Solution {
public:int findMin(vector<int>& nums) {int left = 0;int right = nums.size()-1;while(left < right){int mid = left + (right - left)/2;if(nums[mid] > nums[right]){left = mid +1;}else{right = mid;}}return nums[right];}
};
http://www.dtcms.com/wzjs/492453.html

相关文章:

  • 网页怎么设计图片循环播放邯郸seo排名
  • 买的虚拟主机怎么做网站百度云搜索引擎入口官网
  • php做简单网站教程视频推广方案怎么写模板
  • 城乡建设部网站第35号令长沙seo培训班
  • 日照网站建设定制东莞seo网站管理
  • 怎样做网站的签约设计师蜂蜜网络营销推广方案
  • 贵阳城乡建设网站今天特大新闻最新消息
  • 网站开发招标技术要求清远新闻最新消息
  • 荆州网站建设 众火网长沙网站建设
  • 网站建设报告书范文推广网
  • 聊城哪儿做网站便宜网站推广和网络推广
  • 企业网站建设的重要性及意义武汉seo主管
  • 自己做网站 赚钱上海网站建设方案
  • 长白山网站学做管理站长推广工具
  • 网站建设工具软件测试培训
  • 做web网站原型网站宣传推广方案
  • 信息科技公司网站怎么做应用下载app排行榜
  • 家用电脑桌面做网站湖南关键词优化首选
  • 莱芜网站seo国外独立站网站
  • 想开个影视网站 那有做的济南seo公司报价
  • 找一个网站做搜索引擎分析搜索引擎营销特点
  • 网站建设公司的成本有哪些方面成品人和精品人的区别在哪
  • 中纪委网站作风建设在路上网络营销师证书含金量
  • 网站404页面怎么做品牌如何做推广
  • 邢台网站建设服务商杭州百度百家号seo优化排名
  • 开源网站后台管理系统搜索引擎营销的特点是什么
  • 网站建设服务介绍seo综合查询是什么
  • 沈阳网站建设策划百度百科词条
  • 做网站荣耀体验服官网北京中文seo
  • 国内大型的网站建设搜索引擎付费推广