LeetCode 剑指offer ——旋转数组的最小数字

描述

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1≤ n ≤10000,数组中任意元素的值: 0≤val≤10000
要求:空间复杂度:O(1) ,时间复杂度:O(logn)

示例1

  • 输入: [3,4,5,1,2]
  • 返回值: 1

示例2

  • 输入: [3,100,200,3]
  • 返回值: 3

解题思路

思路1

常规思路,从头开始遍历,找出最小的返回,过于简单了,不贴代码了

思路二

利用这个数组的性质,可以用二分法进行查找

import java.util.ArrayList;
public class Solution {
    
    
    public int minNumberInRotateArray(int [] array) {
    
    
        // 特殊情况判断
        if (array.length== 0) {
    
    
            return 0;
        }
        // 左右指针i j
        int i = 0, j = array.length - 1;
        // 循环
        while (i < j) {
    
    
            // 找到数组的中点 m
            int m = (i + j) / 2;
            // m在左排序数组中,旋转点在 [m+1, j] 中
            if (array[m] > array[j]) i = m + 1;
            // m 在右排序数组中,旋转点在 [i, m]中
            else if (array[m] < array[j]) j = m;
            // 缩小范围继续判断
            else j--;
        }
        // 返回旋转点
        return array[i];
    }
}

思路三

直接忽略排序过程,吧排序交给数据结构,应用TreeMap,TreeMap会把键按照一定顺序排序,而且TreeMap不允许重复的键,故可以令数组元素的值,等于TreeMap的键,遍历一遍之后,返回第一个键。

import java.util.*;
public class Solution {
    
    
    public int minNumberInRotateArray(int [] array) {
    
    
    //寻找最小值
        TreeMap result = new TreeMap();
        for(int i=0;i<array.length;i++){
    
    
            result.put(array[i],i);
        }
        Object a = result.firstKey();        
        return (int)a;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44431331/article/details/124061461
今日推荐