Java版本,第四个会超时, 求优化,谢谢

P4387 【深基15.习9】验证栈序列

congege @ 2023-05-21 12:16:22

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.HashMap;
import java.util.LinkedList;

/**
 * @Author congge
 * @Date 2023/5/20 19:26
 * @description https://www.luogu.com.cn/problem/P4387
 * 【深基15.习9】验证栈序列
 */
public class Main {
    public static void main(String[] args) {
        Input sc = new Input();

        int q = sc.nextInt();
        StringBuilder ans = new StringBuilder();

        while (q-- > 0) {

            int n = sc.nextInt();

            // 该元素在栈中的位置
            HashMap<Integer, Integer> map = new HashMap<>();

            // 该元素是否已经出栈
            boolean[] polled = new boolean[n];

            for (int i = 0; i < n; i++) {
                map.put(sc.nextInt(), i);
            }

            // 存储栈顶元素大小
            LinkedList<Integer> maxList = new LinkedList<>();

            maxList.add(-1);

            // 是否有错版
            boolean flg = false;

            for (int i = 0; i < n; i++) {
                int pollElement = sc.nextInt();
                int pollIndex = map.get(pollElement);

                polled[pollIndex] = true;

                int size = maxList.size();
                if (pollIndex < maxList.get(size - 1)) {
                    flg = true;
                } else if (pollIndex == maxList.get(size - 1)) {
                    while (--pollIndex > 0) {
                        if (!polled[pollIndex]) {
                            break;
                        }
                    }
                    maxList.set(size - 1, pollIndex);
                } else {
                    while (--pollIndex > 0) {
                        if (!polled[pollIndex]) {
                            break;
                        }
                    }
                    maxList.add(pollIndex);
                }
            }
            if (flg) {
                ans.append("No");
            } else {
                ans.append("Yes");
            }
            ans.append('\n');
        }

        System.out.print(ans);
    }

    static class Input {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

        public int nextInt() {
            try {
                in.nextToken();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return (int) in.nval;
        }
    }
}

by mcr123456 @ 2023-05-21 12:33:19

这段代码的时间复杂度主要在于对于每一个弹出的元素,需要遍历一遍栈中所有元素的位置,以确定新的栈顶元素。这个过程可以优化。

可以使用一个变量 maxIndex 来表示当前栈顶元素的位置,初始值为 -1。每弹出一个元素,就比较该元素在栈中的位置与 maxIndex 的大小关系。如果该元素位置比 maxIndex 大,则将其作为新的栈顶元素;否则,就将 maxIndex 向前移动到第一个未弹出的元素位置。

时间复杂度为 O(n)


|