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; } }