1. 程式人生 > 實用技巧 >406根據身高重建佇列

406根據身高重建佇列

406根據身高重建佇列

題目描述

假設有打亂順序的一群人站成一個佇列。 每個人由一個整數對(h, k)表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。 編寫一個演算法來重建這個佇列。

注意:

總人數少於1100人。

示例

輸入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

輸出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

思路

這個題是要求我們按照輸入的每個人的身高及他前面有幾個人來重新整理佇列。

我們可以先將高個子排好,向高個子的前面插入比他矮的,那麼他的k值就不會受影響。

而同樣高的時候,k值較大的應該放在後面

例如 [7,1],[7,0] 的情況是不可能出現的

public static int[][] reconstructQueue(int[][] people) {
        if (people == null || people.length <= 1) {
            return people;
        }
        Arrays.sort(people, (p1, p2) -> p1[0] == p2[0] ? p1[1] - p2[1] : p2[0] - p1[0]);
        List<int[]> ans = new ArrayList<>();
        for (int[] person : people) {
            ans.add(person[1], person);
        }

        return ans.toArray(new int[ans.size()][]);
    }

順便說一下List的add方法

void add(int index, E element);

index為可選引數,表示要插入的元素在list中的索引位置,如果索引超出list.size就會丟擲IndexOutOfBoundsException 索引越界異常。

如果index所在索引本就有元素,那麼將原順序中索引以後的位置全部向後移動一位,之後再向index插入元素

ArrayList:

        List<Integer> arrayList = new ArrayList<>();
        arrayList.add(0,1);
        System.out.println(arrayList);
        arrayList.add(0,2);
        System.out.println(arrayList);
        arrayList.add(0,3);
        System.out.println(arrayList);
        arrayList.add(0,4);
        System.out.println(arrayList);
        arrayList.add(2,5);
        System.out.println(arrayList);
        arrayList.add(4,6);
        System.out.println(arrayList);

結果為

[1]
[2, 1]
[3, 2, 1]
[4, 3, 2, 1]
[4, 3, 5, 2, 1]
[4, 3, 5, 2, 6, 1]

LinkedList:

        List<Integer> linkedList = new LinkedList<>();
        linkedList.add(0,1);
        System.out.println(linkedList);
        linkedList.add(0,2);
        System.out.println(linkedList);
        linkedList.add(0,3);
        System.out.println(linkedList);
        linkedList.add(0,4);
        System.out.println(linkedList);
        linkedList.add(2,5);
        System.out.println(linkedList);
        linkedList.add(4,6);
        System.out.println(linkedList);

結果為

[1]
[2, 1]
[3, 2, 1]
[4, 3, 2, 1]
[4, 3, 5, 2, 1]
[4, 3, 5, 2, 6, 1]

在本題中,因為第一個人的k值必為0,所以可以直接使用add方法來新增