剑指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。

法一:

暴力搜索

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.旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer系列——6.旋转数组的最小数字

剑指Offer面试题:6.旋转数组中的最小数字

《剑指Offer——旋转数组的最小数字》代码

剑指offer旋转数组的最小数字python

剑指 Offer 11. 旋转数组的最小数字 的详细题解

Java 剑指offer(10) 旋转数组的最小数字