随意给一组数,找出满足一下条件的a[i],a[i]左边的数小于等于a[i],a[i]右边的数大于等于a[i]

使用一个额外数组记录每个数后面的最小值是多少,一个额外数组记录一个数前面的最大值是多少,当然,为了减少空间复杂度,可以使用一个数字记录一个数字前面最大值是多少。算法如下:

public List<Integer> findMidNum(int []num)  
    {  
        List<Integer>result=new ArrayList();  
        int[]min=new int[num.length];  
        min[num.length-1]=num[num.length-1];  
          
        for(int i=num.length-2;i>=0;i--)  
        {  
            min[i]=(min[i+1]>num[i])?num[i]:min[i+1];  
        }  
        if(num[0]<=min[0])  
        {  
            result.add(num[0]);  
        }  
          
        int max=num[0];  
        for(int i=1;i<=num.length-2;i++)  
        {  
            max=(max>num[i])?max:num[i];  
            if(num[i]>=max && num[i]<=min[i])  
            {  
                result.add(num[i]);  
                  
            }  
        }  
          
        if(num[num.length-1]>=max)  
        {  
            result.add(num[num.length-1]);  
        }  
          
        return result;  
    }  
原文地址:https://www.cnblogs.com/samulescollection/p/3406892.html