【剑指offer】11. 旋转数组的最小数字

100 阅读1分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 力扣
// 11. 旋转数组的最小数字

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

// 牛客
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0

题解

// 二分查找

// 力扣
// 执行用时:14 ms, 在所有 Java 提交中击败了38.70%的用户
// 内存消耗:38.7 MB, 在所有 Java 提交中击败了22.10%的用户
// 牛客
// 运行时间:177ms
// 占用内存:28280k
class Solution {
    public int minArray(int[] numbers) {
        if (numbers.length == 0) {
            return 0;
        }
        int start = 0, end = numbers.length - 1;
        while (start < end) {
            int mid = (start + end) / 2;
            // System.out.println("start: " + start + " mid: " + mid + " end: " + end);  // 可以打印中间结果试试
            if (numbers[start] == numbers[mid] && numbers[mid] == numbers[end]) {  // 如果三索引数相等,直接for循环遍历找最小值
                return findMin(numbers, start, end);
            }
            else if (numbers[mid] <= numbers[end]) {  // 这里取end索引和mid索引数判断比较方便。
													  // 因为如果发生翻转,翻转部分的所有数值都会比左边第一个数值要小(或相等)。
													  // 如果end索引数比mid索引数大(或相等),最小值一定在左半边,end移到mid位置。
                end = mid;
            }
            else									  // 否则(如果mid索引数比end索引数大),start移动到mid+1位置
                start = mid + 1;
        }
        return numbers[start];  // 直到start与end索引相遇,直接返回该索引数
    }

	// findMin:从左到右,for循环遍历找最小值(根据题意,从左到右遇到的第一个小数即为最小数)
    public static int findMin(int[] numbers, int start, int end) {
        for (int i = start; i <= end; i++) {
            if (numbers[start] > numbers[i]) {
                return numbers[i];
            }
        }
        return numbers[start];
    }
}
// 直接解

// 牛客
// 运行时间:204ms
// 占用内存:28728KB
// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.3 MB, 在所有 Java 提交中击败了70.89%的用户
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length == 0){
            return 0;
        }
        else{
            for(int i = 0; i < array.length - 1; i++){
                if(array[i + 1] - array[i] < 0){
                    return array[i+1];
                }
            }
            return array[0];
        }
    }
}