28 在数组中找到一个局部最小的位置
Table of Contents

ac

二分法并非需要数组有序,只要确认左右某部分确定有要找的内容即可

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1],又有arr[i]<arr[i+1],那么arr[i]是局部最小。
给定无序数组arr,已知arr中任意两个相邻的数不相等。写一个函数,只需返回arr中任意一个局部最小出现的位置即可
[要求]
时间复杂度为O(logn),空间复杂度为O(1)
import java.util.Scanner;


public class Main {

    public static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i ++){
            arr[i] = sc.nextInt();
        }
        int ans = getMinIndex(arr, 0 , n-1);
        System.out.println(ans);
    }

    static int getMinIndex(int[] arr, int left, int right){
        if(left == right){
            return left;
        }
        if(arr[left] < arr[left + 1]){
            return left;
        }
        if(arr[right] < arr[right-1]){
            return right;
        }
        left = left + 1;
        right = right - 1;
        // [大 小 ... 小 大] =》 这之间一定会出现 [大 小 大]
        while (left < right){
            int mid = (left + right) / 2;
            if(arr[mid-1] < arr[mid]){
                right = mid - 1;
            }else if(arr[mid+1] < arr[mid]){
                left = mid + 1;
            }else {
                return mid;
            }
        }
        return left;
    }


}
/*
3
2 1 3

1(出现的位置)
*/