问题描述
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
You may assume no duplicate exists in the array.
思路分析
一个已经排序的数组,在某一个位置分成两段然后交换了顺序,要求找到最小值。
因为交换了位置,所以从尾部向前找,找到一个最小值就是了。
代码
class Solution {
public:
int findMin(vector<int>& nums) {
int i = nums.size() - 1;
while (i > 0 && nums[i - 1] < nums[i]) i--;
return nums[i];
}
};
时间复杂度:
O(n)
O
(
n
)
空间复杂度:
O(1)
O
(
1
)
反思
我以为这道题目为什么这么简单的,实际上还有 O(logn) O ( l o g n ) 的做法。二分搜索。
假设进行了交换,那么新数组的nums[0] < nums[end],因为它们之前应该是相邻的两个递增元素,如果不满足,那说明没有进行交换,直接返回nums[0]。
然后进行二分查找,与正常的不同的是,start端是递增的,但end端是递减的,方便理解,我们对start端进行判断。<=是因为可能计算出和自己的位置相同,所以此时应该强制加一,向前前进。
class Solution {
public:
int findMin(vector<int>& nums) {
int start = 0, end = nums.size() - 1;
while (start < end){
if (nums[start] < nums[end])
return nums[start];
int mid = start + (end - start) / 2;
if (nums[start] <= nums[mid])
start = mid + 1;
else
end = mid;
}
return nums[start];
}
};
时间复杂度:
O(logn)
O
(
l
o
g
n
)
空间复杂度:
O(1)
O
(
1
)