美文网首页
数组中找到左侧比他小右侧比他大的数

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

作者: 西5d | 来源:发表于2019-01-04 10:52 被阅读11次

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

    相关文章

      网友评论

          本文标题:数组中找到左侧比他小右侧比他大的数

          本文链接:https://www.haomeiwen.com/subject/yekhrqtx.html