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,一个连续的上升区间。
python
1. Find Minimum in Rotated Sorted Array数组
解题思路:要找到最小值的话,首先要定一个参考的值,即target是什么。咱们以数组尾做为target,来进行比较,先锁定是右半部分的上升区间,再在这个上升区间中找最小值。找到比num[end]的值要小的不返回而是进一步缩小范围。spa
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 arraycode
这道题听说是检验你是否真的会二分法的题目~由于target已经给出了,那咱们的判断标准就比以前找最小值要多了个判断。以target和end的比较,target和mid的比较,以及这个mid落到了哪一个上升区间来比较~blog
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