题目描述
// 力扣
// 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];
}
}
}