数组中找到左侧比他小右侧比他大的数

2019-01-04  本文已影响11人  西5d

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

上一篇下一篇

猜你喜欢

热点阅读