题解 | 栈和排序

栈和排序

https://www.nowcoder.com/practice/b10a7ac681e9429e89a6a510e5799647

//如果每次循环都用一次Collections.max(intArr.subList(i,N))的话,
//时间复杂度是N**2,但是,
//如果提前先用反向循环设计一个最大值数组,时间复杂度就是N
//即,intArr数组的最后一位肯定是这个(N,N)里最大的,所以从右往左推,用Math.max判断,maxArr每个切片的最大值
import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(System.out);
        int N=Integer.parseInt(br.readLine());
        ArrayList<Integer> intArr=new ArrayList<>();
        String[] arr=br.readLine().split(" ");
        int[] maxArr=new int[N];
        for(String i:arr){
            intArr.add(Integer.parseInt(i));
        }
        maxArr[N-1]=intArr.get(N-1);
        for(int i=N-2;i>=0;i--){
            maxArr[i]=Math.max(maxArr[i+1],intArr.get(i));
        }
        Stack<Integer> sk= new Stack<>();
        for(int i=0;i<N;i++){
            int A=intArr.get(i);
            //原来的:sk.empty()&&A!=Collections.max(intArr.subList(i,N))
            if(sk.empty()&&A!=maxArr[i]){
                sk.push(A);
            }else{
                //原来的:int max=Collections.max(intArr.subList(i,N));
                int max=maxArr[i];
                if(A<max||i==N-1){
                    sk.push(A);
                }else{
                    if(i!=N-1||sk.empty()){pw.print(A+" ");}
                    else{pw.print(A);}
                }
            }
        }
        while(sk.size()!=1&&sk.size()!=0){
            pw.print(sk.pop()+" ");
        }
        pw.print(sk.pop());
        pw.flush();
    }
}

全部评论

相关推荐

02-14 12:40
门头沟学院 Java
程序员花海:1.面试要求必须Java笔试不一定 2.难度对等秋招 远超于日常实习是因为同一批次且转正很多 竞争压力大 3.第一个加点指标,上线了就把接口性能加上去 使用本地缓存这个不算亮点 只是技术选型,要把为什么采用这个和背后的思考写出来而不是单纯堆叠技术没意义 4.八股要一直看 很容易忘记 5.拼团交易这个老问题 堆积技术 另外建议你把奖项合并到教育背景 没必要拆出来放最后
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务