一つ、問題
1.配列の最初の要素を配列の最後に移動します。これを配列の回転と呼びます。昇順配列の回転を入力し、回転した配列の最小要素を出力します。たとえば、配列[3,4,5,1,2]は[1,2,3,4,5]の回転であり、配列の最小値は1です。
2.例
入力:[3,4,5,1,2]
出力:1
入力:[2,2,2,0,1]
出力:0
二、解決策
1.暴力法
添え字0の要素からトラバースを開始します
比較ごとに、現在の要素が次の隣接する要素よりも大きい場合、対応する次の要素が最小値になります
クエリの最後の要素に2がない場合、添え字要素が最小の要素です。
2.二分法
要素を順番に保存する(必須)
package com.haoxiansheng.demo01.SwordfingerOffer;
import lombok.extern.slf4j.Slf4j;
import java.util.Vector;
/**
* @author flame
* @data 2020/10/24
*/
@Slf4j
public class MinArrayDemo {
public static void main(String[] args) {
int [] arr = {
2, 3, 4, 5, 0, 1};
log.info("minArray=>{}", minArray(arr));
}
// 暴力匹配 + 二分查找
// 时间复杂度为 O(n)
// 空间复杂度:O(1)
public static int minArray(int [] numbers) {
int left = 0;
int right = numbers.length -1;
if (right == 0) {
return numbers[0];
}
while (left < right) {
int mid = left + (right - left) / 2;
if (numbers[mid] > numbers[right]) {
left = mid + 1;
} else if(numbers[mid] < numbers[right]) {
right = mid;
} else if (numbers[mid] == numbers[right]) {
right --; // 暴力缩减范围
}
}
return numbers[left];
}
}