LeetCode Find Minimum in Rotated Sorted Array II

简介: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。

v2-2de1be62114ce3d07ff9399df6b321fb_1440w.jpg

Description



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?


描述



假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

注意数组中可能存在重复的元素。


示例 1:

输入: [1,3,5]

输出: 1


示例 2:

输入: [2,2,2,0,1]

输出: 0


说明:

这道题是寻找旋转排序数组中的最小值的延伸题目。

允许重复会影响算法的时间复杂度吗?会如何影响,为什么?


思路



  • 此题目是第153题的递进题,允许重复不会增加算法的时间复杂度,只是会增加判断的条件.
  • 基本思路同153一样.
  • 在增加了重复的情况下,我们先将left移动到相等数值的最右边,right移动到相同数值的最左边,然后我们判断当前的数值是否已经连续递增或递减,若是则直接返回最小值.
  • 若不是,则进行条件判断,这时的条件同第153题目完全一样.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-15 16:01:45
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-15 16:35:18
class Solution:
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        left, right = 0, len(nums) - 1
        while left < right:
            # 相同的值直接跳过
            while left < len(nums) - 1 and nums[left] == nums[left + 1]:
                left += 1
            while right > 0 and nums[right] == nums[right - 1]:
                right -= 1
            middle = left + ((right - left) >> 1)
            # 判断当前的片段是否连续
            # 如果是连续递增,返回最左边的值
            if nums[left] <= nums[middle] <= nums[right]:
                return nums[left]
            # 如果是连续递减,返回最右边的值
            if nums[right] <= nums[middle] <= nums[left]:
                return nums[right]
            # 找到枢纽值的条件
            if nums[middle] < nums[middle + 1] < nums[middle - 1]:
                return nums[middle]
            if nums[middle] > nums[0]:
                left = middle + 1
            if nums[middle] < nums[-1]:
                right = middle
        return nums[left]


源代码文件在这里.


目录
相关文章
|
Java
Leetcode 295. Find Median from Data Stream
在一个有序数组中找中位数,但需要支持再数组中添加新的元素。本来是有序里的,可以很轻易就查到中位数,但如果添加新数字后,不一定有序。如果先对数组排序,那代价就比较大了,每次排序时间复杂度O(n*log(n)),看discuss发现了一种很巧妙的解法,可以把添加数据的时间复杂度降低到O(log(n)) ,查询中位数O(1)。
51 0
Leetcode 4. Median of Two Sorted Arrays
题目描述很简单,就是找到两个有序数组合并后的中位数,要求时间复杂度O(log (m+n))。 如果不要去时间复杂度,很容易就想到了归并排序,归并排序的时间复杂度是O(m+n),空间复杂度也是O(m+n),不满足题目要求,其实我开始也不知道怎么做,后来看了别人的博客才知道有个二分法求两个有序数组中第k大数的方法。
39 0
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
48 0
|
机器学习/深度学习 人工智能 算法
CF1550A Find The Array(贪心算法)
CF1550A Find The Array(贪心算法)
36 0
|
JavaScript 前端开发 索引
Array类型【find】
Array类型【find】
96 0
|
Shell Linux 索引
Linux- 转换 find 命令的返回值为 shell array
本文示例了如何在Linux系统下转换 find 命令的返回值为一个 shell array
213 0
Search in Rotated Sorted Array - 循环有序数组查找问题
Search in Rotated Sorted Array - 循环有序数组查找问题
70 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2

热门文章

最新文章