剑指Offer—— 11. 旋转数组的最小数字

题目如下

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:
输入:[3,4,5,1,2]
输出:1

示例 2:
输入:[2,2,2,0,1]
输出:0


自己的算法及代码

(代码可运行,且提交正确)
具体算法如下:

  • 给最小值初始化 min=-1
  • 遍历数组,如果满足 numbers[i] > numbers[i+1],则将 numbers[i+1] 赋值给 min,并且跳出循环;
  • 判断 min 是否等于初始值 -1,即数组中是否有满足 numbers[i] > numbers[i+1]的情况;
  • 如果 min==-1,则可能有两种情况:最小值在第一个或在最后一个,故比较这两个数的大小;
    • 如果 numbers[0] < numbers[numbers.length-1],则 min = numbers[0]
    • 如果 numbers[0] > numbers[numbers.length-1],则 min = numbers[numbers.length-1]
public class Solution {
    
    

    public static int minArray(int[] numbers) {
    
    
        int min = -1;
        for (int i = 0; i < numbers.length-1; i++){
    
    
            if (numbers[i] > numbers[i+1]){
    
    
                min = numbers[i+1];
                break;
            }
        }
        if (min == -1){
    
    
            if (numbers[0] < numbers[numbers.length-1]){
    
    
                min = numbers[0];
            }else {
    
    
                min = numbers[numbers.length-1];
            }
        }
        return min;
    }

    public static void main(String[] args) {
    
    
        int[] numbers = {
    
    2,3,4,5,1};
        int result = minArray(numbers);
        System.out.println(result);
    }
}

参考的算法及代码(二分查找法)

class Solution {
    
    
    public int minArray(int[] numbers) {
    
    
        int low = 0;
        int high = numbers.length - 1;
        while (low < high) {
    
    
            int middle = low + (high - low) / 2;
            if (numbers[middle] < numbers[high]) {
    
    
                high = middle ;
            } else if (numbers[middle] > numbers[high]) {
    
    
                low = middle + 1;
            } else {
    
    
                high -= 1;
            }
        }
        return numbers[low];
    }
}

猜你喜欢

转载自blog.csdn.net/pary__for/article/details/114527737