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

devtools/2024/9/25 11:15:38/

文章目录

  • 题目描述
  • 算法原理
    • 解法一:暴力查找
    • 解法二:二分查找
      • 疑问
  • 代码实现
    • 解法一:暴力查找
    • 解法二: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];}
}

http://www.ppmy.cn/devtools/23663.html

相关文章

C语言仿写strlen函数以及编程常见的错误、以及,打印菱形、空瓶换水、水仙花数、反转字符串等小案例

文章目录 前言一、仿写strlen函数二、编程常见的错误1. 编译型错误(语法错误)2. 链接型错误(链接期间)3. 运行时错误(最难找) 三、小案例1. 打印菱形2. 两个空瓶换一瓶水的实现3. 打印 aaaaaaaaaaaaaaa......的和4. 打印0-100000"水仙花数"5. 反转字符串 总结 前言 …

任务调度xxljob的使用记录

1.基本使用 a.下载代码&#xff0c;地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job.git b.执行sql&#xff0c;修改配置&#xff0c;启动任务调度中心的代码 启动代码后任务调度中心访问地址&#xff1a;http://localhost:8080/xxl-job-admin&#xff08;自己机器…

超赞!只需几步,打造高颜值的CSS表单!(附代码)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具…

Linux中core dump开启使用教程

Linux中core dump开启使用教程 一、 什么是coredump? 程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;会产生一个叫做core的文件。 core文件会包含了程序运行时的内存&#xff0c;寄存器状态&#xff0c;堆栈指针&#xff0c;内存管理信息还有各种函数…

2023最新!Git2.40.0于win10环境下的安装

2023最新&#xff01;Git2.40.0于win10环境下的安装 git官网地址&#xff1a;https://git-scm.com/download/win/ 导航 文章目录 2023最新&#xff01;Git2.40.0于win10环境下的安装导航一、下载Git二、安装Git三、检验 一、下载Git Git官网选择自己所需的版本下载 二、安装…

开发使用Git的实践操作

程序员在使用Git进行代码管理时&#xff0c;涉及到许多常用的Git命令和功能&#xff0c;以下是详细的解释和分析&#xff1a; 程序员常用的Git命令 git init - 初始化一个新的Git仓库。这是开始使用Git跟踪项目的第一步。git clone - 复制一个远程仓库到本地&#xff0c;这样…

mysql8.0备份,在mysql5.7还原的步骤。备份的sql文件需要做哪些修改?

MySQL 8.0备份在MySQL 5.7还原的步骤涉及几个关键操作。请注意&#xff0c;由于MySQL 8.0和MySQL 5.7在特性和语法上可能存在差异&#xff0c;所以还原过程可能需要特别小心以确保数据的完整性和准确性。以下是一般性的步骤&#xff0c;但具体的实现可能会根据你的系统和环境有…

clickhouse与oracle传输数据

参考 https://github.com/ClickHouse/clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge/blob/master/docker/README.md clickhouse官方提供了一种方式&#xff0c;可以实现clickhouse与oracle之间传输数据&#xff0c;不仅仅是oracle&#xff0…