旋转数组的最小数字
【题目】:
把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个【递增】排序的数组的一个旋转,输出旋转数组的最小元素。
如{3, 4, 5, 1, 2}是{1, 2, 3, 4, 5}的一个旋转,最小元素是1。
示例 1:
输入:[3,4,5,1,2] 输出:1
示例 2:
输入:[2,2,2,0,1] 输出:0
【解题思路】:
- 设置前后指针,通过更新指针,直到两个位置只差为1的时候,第二个指针所指向的位置就是最小元素。
- 需要注意的是两个指针指向的位置的元素一样时,就需要遍历了,如{1, 1, 1, 0, 1}
示例代码1:
def min_num(nums):
if not nums:
return None
index1, index2 = 0, len(nums) - 1
index_mid = index1
while nums[index1] >= nums[index2]:
if index2 - index1 == 1:
return nums[index2]
index_mid = (index1 + index2) // 2
# 如果index1, index2, indexMid指向的元素相同的话,需要进行遍历
if nums[index1] == nums[index2] and nums[index1] == nums[index_mid]:
min_num = index1
for i in nums[index1+1: index2+1]:
min_num = min(min_num, i)
return min_num
if nums[index1] = nums[index_mid]:
index2 = index_mid
return nums[index_mid]
# test
nums = [3, 4, 5, 1, 2]
print("[3,4,5,1,2]:", min_num(nums))
nums = [1, 1, 1, 0, 1]
print("[1,1,1,0,1]:", min_num(nums))
运行结果:
示例代码2:
class Solution(object):
def minArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
return min(numbers)
示例代码3:
class Solution(object):
def minArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
for i in range(len(numbers)-1):
if numbers[i] > numbers[i+1]:
return numbers[i+1]
return numbers[0]
示例代码4:
class Solution(object):
def minArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
n, m = 0, len(numbers)-1
while n < m:
mid = (n+m) // 2
if numbers[mid] > numbers[m]:
n = mid + 1
elif numbers[mid] < numbers[m]:
m = mid
else:
m -= 1
return numbers[n]