![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d3df52b5cd232e1227b2ba1a63672d61.png)
二分查找
解题思路:时间复杂度O(
l
o
g
2
n
log_2n
log2n),空间复杂度O(
1
1
1) |
---|
- 题目的意思是,目前的数组,是一个升序序列旋转后的结果,我们还原后,返回整个序列最小的值即可
- 它这个旋转操作是什么?例如[1,2,3]旋转一次为[2,3,1],继续旋转一次为[3,1,2],再一次为[1,2,3]
我们发现就是将第一个元素旋转到后面,然后其它元素前移一位而已
- 则会出现一个很重要的信息,我们不断将前面较小的值,旋转到后面
- 也就是旋转后的数组分为两部分,[前移的A,旋转到后面的B],A部分每个值都>B的每个值。
例如[1,2,3,4,5]旋转两次为[3,4,5,1,2
],我们发现B部分全部小于A部分,而且B部分的第一个值1就是最小值
- 所以我们二分查找时,如果mid落在A部分,而right在B部分,会出现nums[mid]>nums[right]的情况,此时我们要将mid移到A部分,让left = mid+1
- 而如果我们mid落在A部分,right也在A部分,会出现mid<=right的情况,所以需要到mid左边找,也就是right = mid
- 直到找到B部分的第一个元素为止
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0cab7df4f8c2e0593487b09420f54f8c.png)
class Solution {
public int findMin(int[] nums) {
int low = 0,high = nums.length - 1;
while (low < high) {
int mid = low + (high - low) / 2 ;
if (nums[mid] < nums[high]) {
high = mid;
} else {
low = mid + 1;
}
}
return nums[low];
}
}