|
| 1 | +# 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变 |
| 2 | +# 化后可能得到: |
| 3 | +# |
| 4 | +# 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] |
| 5 | +# 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] |
| 6 | +# |
| 7 | +# |
| 8 | +# 注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], |
| 9 | +# ..., a[n-2]] 。 |
| 10 | +# |
| 11 | +# 给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 |
| 12 | +# |
| 13 | +# 你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。 |
| 14 | +# |
| 15 | +# |
| 16 | +# |
| 17 | +# 示例 1: |
| 18 | +# |
| 19 | +# |
| 20 | +# 输入:nums = [3,4,5,1,2] |
| 21 | +# 输出:1 |
| 22 | +# 解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。 |
| 23 | +# |
| 24 | +# |
| 25 | +# 示例 2: |
| 26 | +# |
| 27 | +# |
| 28 | +# 输入:nums = [4,5,6,7,0,1,2] |
| 29 | +# 输出:0 |
| 30 | +# 解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。 |
| 31 | +# |
| 32 | +# |
| 33 | +# 示例 3: |
| 34 | +# |
| 35 | +# |
| 36 | +# 输入:nums = [11,13,15,17] |
| 37 | +# 输出:11 |
| 38 | +# 解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。 |
| 39 | +# |
| 40 | +# |
| 41 | +# |
| 42 | +# |
| 43 | +# 提示: |
| 44 | +# |
| 45 | +# |
| 46 | +# n == nums.length |
| 47 | +# 1 <= n <= 5000 |
| 48 | +# -5000 <= nums[i] <= 5000 |
| 49 | +# nums 中的所有整数 互不相同 |
| 50 | +# nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转 |
| 51 | +# |
| 52 | +# Related Topics 数组 二分查找 👍 784 👎 0 |
| 53 | + |
| 54 | + |
| 55 | +# leetcode submit region begin(Prohibit modification and deletion) |
| 56 | +class Solution: |
| 57 | + def findMin(self, nums: List[int]) -> int: |
| 58 | + left =0 |
| 59 | + right = len(nums)-1 |
| 60 | + while left<right: |
| 61 | + mid = (left+right)//2 |
| 62 | + if nums[mid]< nums[right]: |
| 63 | + right = mid |
| 64 | + else: |
| 65 | + left = mid+1 |
| 66 | + return nums[left] |
| 67 | +# leetcode submit region end(Prohibit modification and deletion) |
0 commit comments