153. 寻找旋转排序数组中的最小值

方法一:直接遍历。从头到尾遍历,找最小值,时间复杂度o(n)。
class Solution {
public int findMin(int[] nums) {
int len=nums.length;
int min=Integer.MAX_VALUE;
for(int i=0;i<len;i++)
{
if(nums[i]<min)
{
min=nums[i];
}
}
return min;
}
}
方法二:看题目,找的应该是个转折点,从初始下标开始,是递增的,之后有个点,突然断崖式下降,之后又一次递减。可以用二分法找
1.假如mid表示的点大于mid+1表示的点,说明mid+1就是转折点。
2.假如mid这个点,大于start,说明现在处在左侧的递增序列,转折点在右边。
3.mid点小于start,说明转折点在左边
class Solution {//二分法的新解?
public int findMin(int[] nums) {
if(nums.length==1) return nums[0];
int start=0;
int end=nums.length-1;
if(nums[start]<nums[end])//开头小于结尾,说明没有翻转
{
return nums[start];
}
while(start<end)
{
int mid=(start+end)/2;
if(nums[mid]>nums[mid+1])//遇到转折点
{
return nums[mid+1];
}
if(nums[start]<nums[mid])//最左边的点小于mid,说明正处在上升队列在右侧找转折点
{
start=mid+1;
}
else//初始点大于中间点,说明处在第二段的上升区间,转折点应该在左侧
{
end=mid;
}
}
return -1;
}
}

浙公网安备 33010602011771号