[面试题]无序数组中找到左侧比他小右侧比他大的数

无序数组中找到左侧比他小右侧比他大的数,要求时间复杂度在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]++;
            }
        }
    }

posted @ 2019-03-23 13:04  学习记录2019  阅读(1347)  评论(0编辑  收藏  举报