C++实现LeetCode(153.寻找旋转有序数组的最小值)

 更新时间:2021年07月29日 16:17:08   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(153.寻找旋转有序数组的最小值),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 153. Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,  [0,1,2,4,5,6,7] might become  [4,5,6,7,0,1,2]).

Find the minimum element.

You may assume no duplicate exists in the array.

Example 1:

Input: [3,4,5,1,2]
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

这道寻找旋转有序数组的最小值肯定不能通过直接遍历整个数组来寻找,这个方法过于简单粗暴,这样的话,旋不旋转就没有意义。应该考虑将时间复杂度从简单粗暴的 O(n) 缩小到 O(lgn),这时候二分查找法就浮现在脑海。这里是比较难的那一类,没有固定的 target 值比较,而是要跟数组中某个特定位置上的数字比较,决定接下来去哪一边继续搜索。这里用中间的值 nums[mid] 和右边界值 nums[right] 进行比较,若数组没有旋转或者旋转点在左半段的时候,中间值是一定小于右边界值的,所以要去左半边继续搜索,反之则去右半段查找,最终返回 nums[right] 即可,参见代码如下:

解法一:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0, right = (int)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];
    }
};

下面这种分治法 Divide and Conquer 的解法,这里每次将区间 [start, end] 从中间 mid 位置分为两段,分别调用递归函数,并比较返回值,每次取返回值较小的那个即可,参见代码如下:

解法二:

讨论:对于数组中有重复数字的情况,请参见另一篇博文 Find Minimum in Rotated Sorted Array II

Github 同步地址:

https://github.com/grandyang/leetcode/issues/153

类似题目:

Search in Rotated Sorted Array

Find Minimum in Rotated Sorted Array II

参考资料:

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/discuss/48493/Compact-and-clean-C%2B%2B-solution

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/discuss/48484/A-concise-solution-with-proof-in-the-comment

到此这篇关于C++实现LeetCode(153.寻找旋转有序数组的最小值)的文章就介绍到这了,更多相关C++实现寻找旋转有序数组的最小值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++各种数据类型所占内存大小详解

    C++各种数据类型所占内存大小详解

    这篇文章主要介绍了C++各种数据类型所占内存大小,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • QT 中文乱码解决汇总(QString与string、char*互转乱码)

    QT 中文乱码解决汇总(QString与string、char*互转乱码)

    在QT中使用中文时,经常会碰到论码问题,本文主要介绍了QT 中文乱码解决汇总(QString与string、char*互转乱码),需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++示例讲解friend static const关键字的用法

    C++示例讲解friend static const关键字的用法

    静态成员static是解决同一个类的不同对象之间数据和函数共享问题。区分全局变量,全局变量也能实现数据共享,但安全性和封装性被破坏了,友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制,const常引用-被引用的对象不能被更新
    2022-06-06
  • C++实现图形界面时钟表盘代码

    C++实现图形界面时钟表盘代码

    这篇文章主要介绍了C++实现图形界面时钟表盘代码,涉及坐标函数的应用及图形界面程序设计,需要的朋友可以参考下
    2014-10-10
  • QT5.12.5移植到ARM平台下的方法步骤

    QT5.12.5移植到ARM平台下的方法步骤

    本文主要介绍了QT5.12.5移植到ARM平台下的方法步骤,包括修改配置文件、代码修改以及测试运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 解析linux 文件和目录操作的相关函数

    解析linux 文件和目录操作的相关函数

    以下是对linux中文件和目录操作的相关函数进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C++中String增删查改模拟实现方法举例

    C++中String增删查改模拟实现方法举例

    这篇文章主要给大家介绍了关于C++中String增删查改模拟实现方法的相关资料,String是C++中的重要类型,程序员在C++面试中经常会遇到关于String的细节问题,甚至要求当场实现这个类,需要的朋友可以参考下
    2023-11-11
  • C++实现图书馆案例

    C++实现图书馆案例

    这篇文章主要为大家详细介绍了C++实现图书馆案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 解析c语言switch中break语句的具体作用

    解析c语言switch中break语句的具体作用

    以下是对c语言switch中break语句的作用进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • 基于Qt编写简易的视频播放器

    基于Qt编写简易的视频播放器

    这篇文章主要为大家详细介绍了如何利用Qt实现编写简易的视频播放器,可以支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多种内核,感兴趣的可以学习一下
    2022-12-12

最新评论