LeetCode 153. Find Minimum in Rotated Sorted Array

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

v2-752ca4f726a5b6b60508b5c4f8156cfb_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.

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


描述



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

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

请找出其中最小的元素。

你可以假设数组中不存在重复元素。


示例 1:

输入: [3,4,5,1,2]

输出: 1


示例 2:

输入: [4,5,6,7,0,1,2]

输出: 0


思路



  • 此题目考察二分法.
  • 二分法的关键是判断需搜索的值是在当前位置的左边还是当前位置的右边.
  • 此题目中,在没有重复的情况下,一个递增的序列从某个位置p旋转,最小值会小于新数组的左右两端的数值,会使得从数组不在连续递增.反过来说,如果某一段数组连续递增,那么转换的枢纽一定不在此段中.
  • 因此,我们计算中间值,如果数组nums[middle]>nums[0],说明从0到middle(包括)一直在递增,那么要求的枢纽一定在middle(不包括middle本身)右边.
  • 同理如果,nums[middle]<\nums[-1](-1表示最后一个元素),说明从middle到最后一个元素一直在递增,那么要求的枢纽一定在middle左边(包括middle本身,因为middle可能是枢纽本身).
  • 最后找到了middle会满足nums[middle] < nums[middle + 1] < nums[middle - 1]


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-15 13:52:03
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-15 16:00:40
class Solution:
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 如果为空,则直接返回
        if not nums:
            return 0
        # left为最左边的索引,right为最右边的索引
        left, right = 0, len(nums) - 1
        # 首先获取中间值
        middle = left + ((right - left) >> 1)
        # 如果是连续递增的请情况,返回数组的第一个值
        if nums[0] <= nums[middle] <= nums[-1]:
            return nums[0]
        # 如果是连续递减的情况,返回最后一个值
        if nums[-1] <= nums[middle] <= nums[0]:
            return nums[-1]
        while left < right:
            middle = left + ((right - left) >> 1)
            # 结束条件,交换的位置满足下面的条件
            if nums[middle] < nums[middle + 1] < nums[middle - 1]:
                return nums[middle]
            if nums[middle] > nums[0]:
                left = middle + 1
            # 注意这里不是middle-1,因为有可能middle就是要求的枢纽位置
            if nums[middle] < nums[-1]:
                right = middle
        return nums[left]


源代码文件在这里.


目录
相关文章
Leetcode 4. Median of Two Sorted Arrays
题目描述很简单,就是找到两个有序数组合并后的中位数,要求时间复杂度O(log (m+n))。 如果不要去时间复杂度,很容易就想到了归并排序,归并排序的时间复杂度是O(m+n),空间复杂度也是O(m+n),不满足题目要求,其实我开始也不知道怎么做,后来看了别人的博客才知道有个二分法求两个有序数组中第k大数的方法。
204 0
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
222 0
|
机器学习/深度学习 人工智能 算法
CF1550A Find The Array(贪心算法)
CF1550A Find The Array(贪心算法)
160 0
|
JavaScript 前端开发 索引
Array类型【find】
Array类型【find】
282 0
|
Shell Linux 索引
Linux- 转换 find 命令的返回值为 shell array
本文示例了如何在Linux系统下转换 find 命令的返回值为一个 shell array
638 0
Search in Rotated Sorted Array - 循环有序数组查找问题
Search in Rotated Sorted Array - 循环有序数组查找问题
245 0
|
测试技术 PHP 开发者
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
1081 1
Java 中数组Array和列表List的转换
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
410 67
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章