二分法并非需要数组有序,只要确认左右某部分确定有要找的内容即可
O(logN)
O(1)
定义局部最小的概念。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(出现的位置) */