leetcode 153 :Find Minimum in Rotated Sorted Array
题目链接: https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
难度: 中等
归类 : 数组操作, 二分查找, 双指针
题目:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
示例:
示例 1:
输入: [3,4,5,1,2]
输出: 1
示例 2:
输入: [4,5,6,7,0,1,2]
输出: 0
解法:
今天开始转到leetcode上而不是在力扣上做题,感觉leetcode上的解法更好一些。
本题主要使用c++进行了解答,以及经典题解和尝试改进的最优/最简洁解法。
个人解法
c++解法(双指针+二分查找)
本题可以直接一次for循环遍历求最小值,时间复杂度为O(N),但是就遗失掉有序数组这个关键信息。
本题可以使用双指针法+二分查找法来解决。与之前的有序数组二分查找不同的是,本题的有序数组是在未知点旋转过的,即将某个未知点的前半部分接到了数组的尾巴上。
因此设置双指针,start=0,end=len-1,mid=start+(end-satrt)/2。
注意二分查找的判断条件为:
如果nums[mid]>nums[start],说明拐点是mid或者在mid后面,则令start=mid;
如果nums[mid] < nums[end],说明拐点在mid或者在mid前面,则令end=mid;
循环的截止条件为当start和end相邻,即end-start=1时。 此时拐点必为二者之一,此时只需返回二者之中最小值即可。
小窍门: 在最开始,判断数组首值和末值的关系,如果首值小于末值,说明数组没有旋转,直接返回首值即可。
#c++解法
class Solution {
public:
int findMin(vector<int>& nums) {
int len = nums.size();
if(len < 2) return nums[0];
if(nums[0] < nums[len - 1]) return nums[0];
int start = 0, end = len - 1, mid;
while(end - start > 1){
mid = start + (end - start) / 2;
if(nums[mid] > nums[start]) start = mid;
else if(nums[mid] < nums[end]) end = mid;
}
return nums[start] < nums[end] ? nums[start] : nums[end];
}
};
时间复杂度: O(logN)
空间复杂度: O(1)
提交结果:
Runtime: 4 ms, faster than 72.55% of C++ online submissions for Find Minimum in Rotated Sorted Array.
Memory Usage: 10.5 MB, less than 6.67% of C++ online submissions for Find Minimum in Rotated Sorted Array.
题解优解
python解法(二分查找)
貌似没有更优算法,放上一个python版本的
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = 0, len(nums) - 1
while nums[left] > nums[right]:
middle = (left + right) // 2
if nums[middle] < nums[right]:
right = middle
else:
left = middle + 1
return nums[left]
时间复杂度: O(logN)
空间复杂度: O(1)
提交结果:
Runtime: 44 ms, faster than 38.03% of Python3 online submissions for Find Minimum in Rotated Sorted Array.
Memory Usage: 13.8 MB, less than 6.00% of Python3 online submissions for Find Minimum in Rotated Sorted Array.
尝试改进的最优解法
本题使用上述时间复杂度为log(N)的解法最优,能够充分利用有序数组的条件。