模块三:二分——153.寻找旋转排序数组中的最小值

2024-04-26 03:28

本文主要是介绍模块三:二分——153.寻找旋转排序数组中的最小值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目描述
  • 算法原理
    • 解法一:暴力查找
    • 解法二:二分查找
      • 疑问
  • 代码实现
    • 解法一:暴力查找
    • 解法二:C++
    • Java

题目描述

题目链接:153.寻找旋转排序数组中的最小值
在这里插入图片描述
根据题目的要求时间复杂度为O(log N)可知需要使用二分查找。

算法原理

解法一:暴力查找

遍历数组一遍,寻找数组最小值并返回,时间复杂度为O(N),因为需要遍历数组一遍,与本题要求不符,但是可以AC
PS:写这个解法的原因是因为我们最好想也最好写的解法就是暴力解法,经验不足的话都是靠暴力解法来做题的,搞懂了暴力解法之后,我们再去根据所学的算法和经验,借助画图,根据题目要求来优化我们的暴力解法,会让我们的基础比较扎实。

解法二:二分查找

在这里插入图片描述
⼆分的本质:找到⼀个判断标准,使得查找区间能够⼀分为⼆。(二段性
我们可以把数组划分成两部分,其中C点就是我们要的答案。通过图像我们可以发现, [A,B] 区间内的点都是严格⼤于 D 点的值的, C 点的值是严格⼩于 D 点的值的。但是当 [C,D] 区间只有⼀个元素的时候, C 点的值是可能等于 D 点的值的。
因此,初始化左右两个指针 left , right :然后根据 mid 的落点,我们可以这样划分下⼀次查询的区间:

  • 当 mid 在 [A,B] 区间的时候,也就是 mid 位置的值严格⼤于 D 点的值,下⼀次查询区间在 [mid + 1,right]上;
  • 当 mid 在 [C,D] 区间的时候,也就是 mid 位置的值严格⼩于等于 D 点的值,下次查询区间在 [left,mid] 上。
  • 当区间⻓度变成 1 的时候,就是我们要找的结果。

疑问

请问可以选择A点作为参照物吗?大家可以想一想
答案放在解法二的C++代码部分解答。

代码实现

解法一:暴力查找

class Solution {
public:int findMin(vector<int>& nums) {int ret = INT_MAX;for(int i = 0;i < nums.size();++i){ret = min(ret,nums[i]);}return ret;}
};

解法二:C++

class Solution {
public:int findMin(vector<int>& nums) {//根据二段性可以使用二分int left = 0,right = nums.size() - 1;if(nums[left] < nums[right])return nums[left];while(left < right){int mid = left + (right - left) / 2;//答案是可以的,但是需要写成if(nums[mid] >= nums[0]),因为//当left = mid的时候,即只有两个数的时候,我们会跑去AB部分找答案//这会导致部分用例无法通过if(nums[mid] > nums[nums.size() - 1])left = mid + 1;else right = mid;}return nums[left];}
};

Java

class Solution {public int findMin(int[] nums) {int left = 0, right = nums.length - 1;int x = nums[right]; // 标记⼀下最后⼀个位置的值while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > x)left = mid + 1;elseright = mid;}return nums[left];}
}

这篇关于模块三:二分——153.寻找旋转排序数组中的最小值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936582

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(