今日頭條程式設計題1 找"最大"點

Inequality-Sign發表於2018-03-27

P為給定的二維平面整數點集。定義 P 中某點x,如果x滿足 P 中任意點都不在 x 的右上方區域內(橫縱座標都大於x),則稱其為“最大的”。求出所有“最大的”點的集合。(所有點的橫座標和縱座標都不重複, 座標軸範圍在[0, 1e9) 內)
如下圖:實心點為滿足條件的點的集合。請實現程式碼找到集合 P 中的所有 ”最大“ 點的集合並輸出。
這裡寫圖片描述

輸入描述:
第一行輸入點集的個數 N, 接下來 N 行,每行兩個數字代表點的 X 軸和 Y 軸。
對於 50%的資料, 1 <= N <= 10000;
對於 100%的資料, 1 <= N <= 500000;

輸出描述:
輸出“最大的” 點集合, 按照 X 軸從小到大的方式輸出,每行兩個數字分別代表點的 X 軸和 Y軸。

輸入例子1:
5
1 2
5 3
4 6
7 5
9 0

輸出例子1:
4 6
7 5
9 0

思路是先按照x軸升序排序
然後從後往前遍歷所有的點,不斷更新y最大的值,如果當前點超過y最大值,則將點入棧,並更新y最大值。
然後依次出棧就是結果了

public static void main(String[] args) {
        List<Point> points = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        int nums = scanner.nextInt();
        for (int i = 0; i < nums; i++) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            Point point = new Point(x,y);
            points.add(point);
        }
        Collections.sort(points, new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                return o1.x - o2.x;
            }
        });
        int maxy = -1;
        Stack<Point> stack = new Stack<>();
        for (int i = points.size() - 1; i >= 0  ; i--) {
            if(points.get(i).y > maxy) {
                stack.push(points.get(i));
                maxy = points.get(i).y;
            }
        }
        while (!stack.empty()) {
            Point p = stack.pop();
            System.out.println(p.x + " " + p.y);
        }
    }

相關文章