二分法的小变动
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
方法一:二分法(代码来源于 @FINACK 大佬)
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { if(array.length==0){ return 0; } int low=0,high=array.length-1; while(low<high){ int mid=(low+high)/2; if(array[mid]>array[high]){ low=mid+1; }else if(array[mid]==array[high]){ low=mid+1; //或者high--; }else{ high=mid;// 针对只有两个元素的情况 } } return array[low]; }
方法二:因为是有序数组的部分元素的反转,那么肯定是被划分为两个有序的子部分,一个递增,一个递减。而且递增的子数组是排在前面(此时可以假设最小值就是下标为0的数组元素),那么就可以通过最小值是否变动了来判断是否找到了俩个子数组的交界处(也就是最小元素处)
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { if(array.length==0){ return 0; } int min=array[0]; for(int i=1;i<array.length;i++){ if(array[i]<min){ min=array[i]; break; } } return min; } }#21天打卡剑指offer##Java#