原题链接:153. Find Minimum in Rotated Sorted Array
【思路2-Python】递归实现
【思路-Java】非递归实现
这是二分查找的应用。我们平时的二分查找是给定目标值,让你找到它的位置。而这里我们采取的策略是,nums[mid]和 nums[right]做比较。为什么这么做?因为题目已经说这是一个排好序的数组,旋转得到的,如果 nums[mid] < nums[right] 时,最小值一定在 [left, mid] 之间。
情况无非下图三种情况中的一种:
public class Solution {
public int findMin(int[] nums) {
int left = 0, right = nums.length-1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < nums[right]) right = mid;
else left = mid + 1;
}
return nums[right];
}
}
146 / 146 test cases passed. Runtime: 1 ms Your runtime beats 2.14% of javasubmissions.
【思路2-Python】递归实现
递归实现和非递归实现是一种对应关系。在递归取代了了非递归中的 while 或 for 循环,递归终止条件和非递归终止条件一样,都是 left >= right。其他的很简单,不再赘述了:
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
def binarySearch(nums, left, right) :
if left >= right : return nums[right]
mid = (left+right) / 2
if nums[mid] < nums[right] :
return binarySearch(nums, left, mid)
else :
return binarySearch(nums, mid+1, right)
return binarySearch(nums, 0, len(nums)-1)
146 / 146
test cases passed. Runtime: 48 ms Your runtime beats 27.62% of pythonsubmissions.