旋转数组的最小数字
2017-07-23 20:00
246 查看
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
代码:
思路:看到这个题,可以用暴力方法遍历数组,搜出最小值,时间复杂度为o(N)。但题目条件为非递减排序的数组,联想到使用二分查找。取mid的值与左右两边的值进行比较,如果array[mid]>=array[start],则说明mid现在的位置位于左边的非递减序列中,最小值应该出现在左边非递减序列的右边,所以start=mid。如果array[mid]<=array[start],则说明mid现在的位置位于右边的非递减序列中,最小值应该出现在右边非递减序列的左边,所以end=mid。依次缩小范围,跳出条件为搜索到只有start和end时,end肯定为最小值跳出。
注意:当start、mid、end对应的值都相等时,此时无法判断mid到底属于左序列还是属于右序列。比如{1,0,1,1,1}和{1,1,1,0,1}两个数组都为{0,1,1,1,1}的旋转,但是{1,0,1,1,1}中的mid对应的1属于右序列,而{1,1,1,0,1}中的mid对应的1属于左序列。也就是说:无法定位mid在哪一边则无法缩小查找范围,那么这时候我们就需要采用顺序查找。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
代码:
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { if (array.length==0){ return 0; } int start=0; int end=array.length-1; int mid=start; while (array[start]>=array[end]){ mid=(start+end)/2; if (end-start==1){//跳出条件 mid=end; break; } if (array[mid]==array[start]&&array[mid]==array[end]){ return findMin(array,start,end);//顺序查找 } if (array[mid]>=array[start]){ start=mid; }else if (array[mid]<=array[end]){ end=mid; } } return array[mid]; } private int findMin(int[] array,int start,int end){ int min=array[start]; for (int i=min+1;i<=end;i++){ if (array[i]<min){ return array[i]; } } return min; } }
思路:看到这个题,可以用暴力方法遍历数组,搜出最小值,时间复杂度为o(N)。但题目条件为非递减排序的数组,联想到使用二分查找。取mid的值与左右两边的值进行比较,如果array[mid]>=array[start],则说明mid现在的位置位于左边的非递减序列中,最小值应该出现在左边非递减序列的右边,所以start=mid。如果array[mid]<=array[start],则说明mid现在的位置位于右边的非递减序列中,最小值应该出现在右边非递减序列的左边,所以end=mid。依次缩小范围,跳出条件为搜索到只有start和end时,end肯定为最小值跳出。
注意:当start、mid、end对应的值都相等时,此时无法判断mid到底属于左序列还是属于右序列。比如{1,0,1,1,1}和{1,1,1,0,1}两个数组都为{0,1,1,1,1}的旋转,但是{1,0,1,1,1}中的mid对应的1属于右序列,而{1,1,1,0,1}中的mid对应的1属于左序列。也就是说:无法定位mid在哪一边则无法缩小查找范围,那么这时候我们就需要采用顺序查找。
相关文章推荐
- 题目1386:旋转数组的最小数字
- 【剑指offer】旋转数组的最小数字
- 剑指offer 旋转数组的最小数字
- (C++)剑指offer-6:旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组中的最小数字
- 剑指Offer面试题:7.旋转数组的最小数字
- Python:旋转数组的最小数字
- 九度oj 第3题 旋转数组的最小数字 何海涛:《剑指Offer:名企面试官精讲典型编程题》
- 剑指offer—旋转数组的最小数字
- 《剑指offer》-旋转数组的最小数字
- 《剑指offer》—6、旋转数组的最小数字
- 6、旋转数组的最小数字
- 九度 题目1386:旋转数组的最小数字
- 剑指offer编程题Java实现——面试题8旋转数组的最小数字
- 面试题8:旋转数组中的最小数字
- 面试题8:旋转数组的最小数字