10-22 LeetCode 154. Find Minimum in Rotated Sorted Array II
Find Minimum in Rotated Sorted Array II
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:
[0, 1, 2, 3, 4, 5, 6, 7]
可能变为[4, 5, 6, 7, 0, 1, 2]
Solution 1:
这题目很奇怪,我觉得这题目一点难度都没有,但是居然是一个hard难度的题目。导致我怀疑自己是不是理解错了,结果提交了代码AC了,运行速度排名还击败了93%。
既然是升序的,那么从第一个开始遍历,开始下降的那个就是最小的。于是按照这个思路的代码如下:
代码:
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return
min_num = nums[0]
flag = True
for num in nums:
if num < min_num:
min_num = num
break
return min_num
Solution 2:
抱着我的疑惑,我看了下其他人提交的代码。清一色全是二分法。但是就算用二分,也看不出这题目的难度,况且大多数二分法的运行速度还没有我快。
二分法的大致思路是这样,头尾两个指针,将中间值与尾指针的值比较,如果中间值大,则最小值在右边那一段中,头指针指向中间右移一个元素;如果中间值小,则最小值在左边那一段,右指针指向中间元素;如果相等,右指针左移一个。
代码:
def findMin(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[right]:
right = mid
elif nums[mid] > nums[right]:
left = mid + 1
else:
right -= 1
return nums[left]
感想
最近学的东西比较多,越学越发现不会的多。课程压力也比较大,所以刷题时间少了。