返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中怎么利用LeetCode寻找旋转有序数组的最小值
  • 222
分享到

C++中怎么利用LeetCode寻找旋转有序数组的最小值

2023-06-20 18:06:42 222人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关c++中怎么利用LeetCode寻找旋转有序数组的最小值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。[LeetCode] 154. Find Minimum i

这篇文章将为大家详细讲解有关c++中怎么利用LeetCode寻找旋转有序数组的最小值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

[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:

  • This is a follow up problem to Find Minimum in Rotated Sorted Array.

  • Would allow duplicates affect the run-time complexity? How and why?

这道寻找旋转有序重复数组的最小值是之前那道 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));    }};

关于C++中怎么利用LeetCode寻找旋转有序数组的最小值就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: C++中怎么利用LeetCode寻找旋转有序数组的最小值

本文链接: https://lsjlt.com/news/299084.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中怎么利用LeetCode寻找旋转有序数组的最小值
    这篇文章将为大家详细讲解有关C++中怎么利用LeetCode寻找旋转有序数组的最小值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。[LeetCode] 154. Find Minimum i...
    99+
    2023-06-20
  • C++实现LeetCode(153.寻找旋转有序数组的最小值)
    [LeetCode] 153. Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值 Suppose an array sorted i...
    99+
    2024-04-02
  • C++实现LeetCode(154.寻找旋转有序数组的最小值之二)
    [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二 Suppose an array sor...
    99+
    2024-04-02
  • C++实现寻找旋转有序数组的最小值的方法
    本篇内容介绍了“C++实现寻找旋转有序数组的最小值的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!寻找旋转有序数组的最小值Suppose...
    99+
    2023-06-20
  • C++实现LeetCode(33.在旋转有序数组中搜索)
    [LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索 Suppose an array sorted in ascendi...
    99+
    2024-04-02
  • C++实现LeetCode(81.在旋转有序数组中搜索之二)
    [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索之二 Suppose an array sorted in as...
    99+
    2024-04-02
  • C++怎么实现在旋转有序数组中搜索
    这篇文章主要介绍了C++怎么实现在旋转有序数组中搜索的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现在旋转有序数组中搜索文章都会有所收获,下面我们一起来看看吧。Search in Rotated S...
    99+
    2023-06-19
  • C++中怎么利用LeetCode求最大子数组乘积
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode求最大子数组乘积,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 152. Maximum Product Subarr...
    99+
    2023-06-20
  • 使用JavaScript怎么遍历查找数组中最大值与最小值
    本篇文章给大家分享的是有关使用JavaScript怎么遍历查找数组中最大值与最小值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:&l...
    99+
    2024-04-02
  • c++怎么求数组的最大和最小值
    本篇内容主要讲解“c++怎么求数组的最大和最小值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c++怎么求数组的最大和最小值”吧!求数组元素最大最小值函数#include<iostream...
    99+
    2023-07-02
  • 利用Java_int怎么求数组中的最大值
    本篇文章为大家展示了利用Java_int怎么求数组中的最大值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体方法如下:public class ArrayUtils ...
    99+
    2023-05-31
    java ava int
  • vb怎么找出数组中的最大值
    要找出数组中的最大值,可以使用循环遍历数组,比较每个元素的大小,记录下最大的值。可以使用以下代码来实现:```vbDim array...
    99+
    2023-10-12
    vb
  • 怎么在php中求数组的最小值
    在php中求数组最小值的方法有:1.使用min函数求数组最小值;2.使用for循环求数组最小值;使用min函数求数组的最小值$arr = ['10','100','50','90','2','5'];$min = min($arr); //...
    99+
    2024-04-02
  • r语言怎么获取数组中的最大值和最小值
    在R语言中,可以使用max()函数和min()函数来获取数组中的最大值和最小值。 例如,假设有一个包含一组数字的数组x,要获取该数组...
    99+
    2024-03-06
    r语言
  • C++中怎么利用LeetCode移除有序链表中的重复项
    C++中怎么利用LeetCode移除有序链表中的重复项,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。[LeetCode] 83. Remove Duplicates from ...
    99+
    2023-06-20
  • C++实现LeetCode(34.在有序数组中查找元素的第一个和最后一个位置)
    [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位...
    99+
    2024-04-02
  • php中怎么找出数组中重复率最高的值
    php中怎么找出数组中重复率最高的值,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们来看看下面一个例子。<phpheader("Content...
    99+
    2023-06-20
  • C++中怎么利用LeetCode翻转字符串中的单词
    这篇文章将为大家详细讲解有关C++中怎么利用LeetCode翻转字符串中的单词,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。[LeetCode] 557.Reverse Words in a...
    99+
    2023-06-20
  • C++中怎么利用LeetCode求位1的个数
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode求位1的个数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 191.Number of 1 Bits 位1的个数Wri...
    99+
    2023-06-20
  • 怎么在java中利用二分法寻数组的位置
    怎么在java中利用二分法寻数组的位置?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作