하나, 문제
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];
}
}