题目链接:leetcode153
题面
题目大意
题目中的旋转可以理解成整个有序数组循环左移,找旋转点相当于找这个左移的开头,由于原序列有序,相当于找数组的最小值。数组中的元素不重复!
解题思路
暴力
遍历一次数组,寻找最小值。
时间复杂度 O ( n ) O(n) O(n) ,空间复杂度 O ( 1 ) O(1) O(1)。
二分
由于原序列有序,根据左移的特性,我们可以进行二分:
- 如果 mid 的元素值小于等于右端点的元素值,显然旋转点就在 mid 的左边,则此时 r = mid
- 否则旋转点在 mid 的右边,则此时 l = mid + 1
注意,由于二分写法的不同,边界情况要考虑好。
代码实现
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0, r = nums.size()-1, mid;
while (l < r) {
mid = l + (r - l >> 1);
if (nums[mid] <= nums[r]) r = mid;
else l = mid + 1;
}
return nums[l];
}
};