在牛客网做题发现这道题的高赞回答解题不够简洁爽快,奈何回复太晚被埋没在评论中,在此与有缘人分享下!
原题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
思路:数组下标其实就是一种指针,利用这一性质即可。
旋转后的数组可以看成前后两个非递减序列。
首先,选取数组中间的数array[center]
然后,与当前数组的头尾元素比较,此时分两种情况考虑:
1、中间数大于等于当前数组头元素,则中间元素在前一递增序列中,意味着最小值一定在该元素之后,于是将数组范围缩小到 此中间数的下标 到 数组尾。
2、中间数小于等于当前数组尾元素,则中间元素在后一递增序列中,意味着最小值一定在该元素之前,于是将数组范围缩小到 数组头 到 此中间数的下标。
循环的最后,一定是数组的头指向前一个非递减序列的最后一个元素,尾指向后一个非递减序列的头元素,即最小值。
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int preIndex=0;
int endIndex=array.length-1;
int center;
while(endIndex-preIndex>1){
center=(endIndex+preIndex)/2;
if(array[center]>=array[preIndex])
preIndex=center;
if(array[center]<=array[endIndex])
endIndex=center;
}
return array[endIndex];
}
}