Search in rotated sorted array,题目中也给出了相应的例子,就是在sorted array某个节点发生了翻转(ie.0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)。所以我们可以把这个sorted array 分成两部分看,一部分是左半部分的上升区间,然后是最小值,一部分是右半部分的上升区间。以及考虑其中的特例就是翻转后仍是原来的array,一个连续的上升区间。
1. Find Minimum in Rotated Sorted Array
解题思路:要找到最小值的话,首先要定一个参考的值,即target是什么。我们以数组尾作为target,来进行比较,先锁定是右半部分的上升区间,再在这个上升区间中找最小值。找到比num[end]的值要小的不返回而是进一步缩小范围。
class Solution:
# @param num: a rotated sorted array
# @return: the minimum number in the array
def findMin(self, num):
# set the last element as target, and find the second ascending period
start = 0
end = len(num) - 1
while start + 1 < end:
mid = start + (end - start) / 2
if num[mid] <= num[end]:
end = mid
else:
start = mid
return min(num[start],num[end])
2. Search in rotated sorted array
这道题据说是检验你是否真的会二分法的题目~因为target已经给出了,那我们的判断标准就比之前找最小值要多了个判断。以target和end的比较,target和mid的比较,以及这个mid落到了哪个上升区间来比较~
class Solution:
"""
@param A : a list of integers
@param target : an integer to be searched
@return : an integer
"""
def search(self, A, target):
if A is None or len(A) == 0:
return -1
start = 0
end = len(A) - 1
while (start + 1 < end):
mid = start + (end - start) / 2
if A[mid] == target:
return mid
elif A[end] < A[mid]:
if A[end] < target and target <= A[mid]:
end = mid
else:
start = mid
else:
if A[mid] <= target and target <= A[end]:
start = mid
else:
end = mid
if A[end] == target:
return end
if A[start] == target:
return start
return -1