剑指offer 6.旋转数组的最小数字
Posted hi3254014978
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 6.旋转数组的最小数字相关的知识,希望对你有一定的参考价值。
6. 旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
法一:
暴力搜索
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { // 从头到尾扫描,记录前一个值大于后一个值的位置 if(array.length <= 0) return 0; for(int j = 0; j < array.length - 1; j++){ if(array[j + 1] < array[j]){ return array[j + 1]; } } return 0; } }
法二:
利用二分法的变形
分析:二分查找变种,没有具体的值用来比较。那么用中间值和高低位进行比较,看处于递增还是递减序列,进行操作缩小范围。
1. 处于递增:low上移
2. 处于递减:high下移(如果是high-1
,则可能会错过最小值,因为找的就是最小值)
3. 其余情况:low++缩小范围
特殊情况:
1 import java.util.ArrayList; 2 public class Solution { 3 public int minNumberInRotateArray(int [] array) { 4 // 从头到尾扫描,记录前一个值大于后一个值的位置 5 if(array.length <= 0) 6 return 0; 7 // 变形的二分查找 8 int low = 0, high = array.length - 1; 9 int mid; 10 while(low < high){ 11 mid = (high - low) / 2 + low; 12 if(array[low] < array[high]) 13 return array[low]; 14 if(array[mid] > array[low]){ 15 low = mid + 1; 16 }else if(array[mid] < array[high]){ 17 high = mid; 18 }else{ 19 low++; 20 } 21 } 22 return array[low]; 23 } 24 }
以上是关于剑指offer 6.旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章