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 语言编写一个计算器界面(可视化界面和多功能)

    今天给大家分享一个计算器功能,主要功能有加法减法乘除法求余功能,用户可以在主菜单选择需要计算的功能,接下来根据用户输入的数字进行计算输出结果,喜欢的朋友拿去用吧
    2021-06-06
  • VC++时钟函数

    VC++时钟函数

    VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作
    2015-06-06
  • c++如何使用openssl接口来生成随机数

    c++如何使用openssl接口来生成随机数

    OpenSSL是一个强大的加密库,不仅支持加密解密,还能生成随机数,设置过程包括下载资源文件、配置项目及修改属性页等步骤,确保库文件正确包含,在Visual Studio中正确配置后,可使用RAND_bytes函数生成随机数,此过程需要注意文件路径和附加目录的设置
    2024-10-10
  • 详解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    详解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    这篇文章主要介绍了详解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 从c++标准库指针萃取器谈一下traits技法(推荐)

    从c++标准库指针萃取器谈一下traits技法(推荐)

    本篇文章基于gcc中标准库源码剖析一下标准库中的模板类pointer_traits,并且以此为例理解一下traits技法,对c++ traits技法源码分析感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • C语言中的冒泡排序问题

    C语言中的冒泡排序问题

    这篇文章主要介绍了C语言中的冒泡排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Qt使用随机验证码的实现示例

    Qt使用随机验证码的实现示例

    有时候在登录界面需要验证码功能,这样能够防止被恶意程序攻击,本文主要介绍了Qt使用随机验证码的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C++ cin.get用法案例详解

    C++ cin.get用法案例详解

    这篇文章主要介绍了C++ cin.get用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言数据类型枚举enum全面详解示例教程

    C语言数据类型枚举enum全面详解示例教程

    生活中有很多地方会用到枚举,比如一周有7天,可以一一枚举;性别有男、女...等等都可以可以一一枚举,今天来和笔者一起学习一下c语言枚举吧
    2021-10-10
  • c语言动态内存分配知识点及实例

    c语言动态内存分配知识点及实例

    在本篇文章里小编给大家整理的是关于c语言动态内存分配知识点及实例,需要的朋友们可以学习下。
    2020-03-03

最新评论