无序数组中找到左侧比他小右侧比他大的数,要求时间复杂度在O(n)。思路是单独创建一个标记数组,先从左往右遍历(i=0开始),找最大,如果是当前的最大,max标记位置和当前游标有max=i,则设置标记数组位置+1;同理,从len-1的位置,找最小,即从右往左遍历(i=len-1开始),找最小,如果是当前的最小,min标记位置和当前游标min=i,并把标记数组位置+1;最终标记数组中如果既是比左侧大的数又是比右侧小的数的值为2,用标记数组过滤一次原数组就可以得到。时间复杂度为3n,空间为n。
代码
public static void main(String[] args) { int[] arr = new int[]{1,2,3,9,5,6,10,11,13,15,17}; int[] mos = new int[arr.length]; System.out.println(Arrays.toString(mos)); findMiddle(arr,mos); System.out.println(Arrays.toString(mos)); for (int i = 0; i < arr.length; i++) { if (mos[i] == 2) { System.out.print(arr[i]); System.out.print(" "); } } } static void findMiddle(int[] arr,int[] mos) { if (null == arr || arr.length <= 2) { return; } int max = 0; int min = arr.length-1; for (int i = 0; i < arr.length; i++) { max=arr[max]<=arr[i]?i:max; if (max == i) { mos[i]++; } } for (int i = arr.length-1; i >=0; i--) { min=arr[min]>=arr[i]?i:min; if (min == i) { mos[i]++; } } }