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

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

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

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.

The array may contain duplicates.

Example 1:

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

Example 2:

Input: [2,2,2,0,1]
Output: 0

Note:

这道寻找旋转有序重复数组的最小值是之前那道 Find Minimum in Rotated Sorted Array 的拓展,当数组中存在大量的重复数字时,就会破坏二分查找法的机制,将无法取得 O(lgn) 的时间复杂度,又将会回到简单粗暴的 O(n),比如这两种情况:{2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 和 {2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2},可以发现,当第一个数字和最后一个数字,还有中间那个数字全部相等的时候,二分查找法就崩溃了,因为它无法判断到底该去左半边还是右半边。这种情况下,将右指针左移一位(或者将左指针右移一位),略过一个相同数字,这对结果不会产生影响,因为只是去掉了一个相同的,然后对剩余的部分继续用二分查找法,在最坏的情况下,比如数组所有元素都相同,时间复杂度会升到 O(n),参见代码如下:

解法一:

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 if (nums[mid] < nums[right]) right = mid;
            else --right;
        }
        return nums[right];
    }
};

跟之前那道 Find Minimum in Rotated Sorted Array 一样,还是可以用分治法 Divide and Conquer 来解,不过写法跟之前那道略有不同,只有在 nums[start] < nums[end] 的时候,才能返回 nums[start],等于的时候不能返回,比如 [3, 1, 3] 这个数组,或者当 start 等于 end 成立的时候,也可以直接返回 nums[start],后面的操作跟之前那道题相同,每次将区间 [start, end] 从中间 mid 位置分为两段,分别调用递归函数,并比较返回值,每次取返回值较小的那个即可,参见代码如下:

解法二:

class Solution {
public:
    int findMin(vector<int>& nums) {
        return helper(nums, 0, (int)nums.size() - 1);
    }
    int helper(vector<int>& nums, int start, int end) {
        if (start == end) return nums[start];
        if (nums[start] < nums[end]) return nums[start];
        int mid = (start + end) / 2;
        return min(helper(nums, start, mid), helper(nums, mid + 1, end));
    }
};

Github 同步地址:

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

类似题目:

Find Minimum in Rotated Sorted Array

参考资料:

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

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/discuss/48808/My-pretty-simple-code-to-solve-it

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/discuss/167981/Beats-100-Binary-Search-with-Explanations

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

相关文章

  • C++ MD5的源码实例详解

    C++ MD5的源码实例详解

    这篇文章主要介绍了C++ MD5的源码实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言重难点之内存对齐和位段

    C语言重难点之内存对齐和位段

    这篇文章主要介绍了C语言重难点之内存对齐和位段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C++字符数组、字符数组指针和string类

    C++字符数组、字符数组指针和string类

    这篇文章主要介绍了C++字符数组、字符数组指针和string类,string是一个类而不是基本数据类型,数组不含有处理函数,下面更多详细内容,需要的小伙伴可以参考下面文章
    2022-03-03
  • C语言位图算法详解

    C语言位图算法详解

    这篇文章主要介绍了C语言实现的位图算法,主要包括了位图算法的定义与应用,对于C程序算法设计的学习有一定的借鉴价值,需要的朋友可以参考下
    2014-09-09
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    本篇文章是对虚函数与纯虚函数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 提升编程能力的C语言技巧总结

    提升编程能力的C语言技巧总结

    这篇文章主要为大家总结了一些C语言技巧的相关资料,可以帮助大家大大提升编程能力。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • c文件汇编后函数参数传递的不同之处

    c文件汇编后函数参数传递的不同之处

    在w7 32位系统下把c文件汇编后,确实与mac后的差异很大。可不仅仅是寄存器eax与rax的区别。我想说的是函数参数传递的不同
    2013-11-11
  • C语言进阶教程之字符串&内存函数

    C语言进阶教程之字符串&内存函数

    对于字符,在计算机内部都是用数字(字符编码)来表示的,而字符串是“字符连续排列”的一种表现,这篇文章主要给大家介绍了关于C语言进阶教程之字符串&内存函数的相关资料,需要的朋友可以参考下
    2021-09-09
  • 深入理解c/c++ 内存对齐

    深入理解c/c++ 内存对齐

    这篇文章主要介绍了c/c++ 内存对齐,有需要的朋友可以参考一下
    2014-01-01
  • Qt 添加MSVC2017编译器的完整教程(保姆级)

    Qt 添加MSVC2017编译器的完整教程(保姆级)

    本文主要介绍了Qt 添加MSVC2017编译器的完整教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06

最新评论