Queue Reconstruction by Height

Queue Reconstruction by Height

題目連接:https://leetcode.com/problems...app

greedy的題感受思路好難寫啊。
首先確定是要排序,首先想到的思路是先按h再按k排序,h從低到高,k從高到低,緣由是第一步想先把是0的yi 個一個放進結果裏,而後把前面的k都--,第二遍仍是找k = 0的。一直重複到結束。code

es: [[4, 4], [5, 2], [5, 0], [6, 1], [7, 1], [7, 0]]排序

  • 第一遍:leetcode

    • result: [[5, 0], [7, 0]]get

    • aux: [[4, 2], [5, 0], [6, 0], [7, 0]]io

  • 第二遍:class

    • result: [[5, 0], [7, 0], [5, 2], [6, 1]]List

    • aux: [[4, 0], [7, 0]]queue

  • 第三遍:sort

    • result: [[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]]

    • aux: []

每次最前面的減的是最多的,因此考慮倒過來作:
[[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]
這樣減的時候就是碰到[7, 0]以後[7, 1], [6, 1]先減1,碰到了[5, 0],以後[5, 2], [4, 4]是減2。又因爲減到0的時候要倒過來append到結果裏面,實際上就是把h小的查到前面對應位置的過程。discussion給的解法實在太厲害了,真想不出來。

public class Solution {
    public int[][] reconstructQueue(int[][] people) {
        if(people.length == 0) return people;
        
        Arrays.sort(people, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);
        List<int[]> result = new ArrayList();
        for(int[] person : people) {
            result.add(person[1], person);
        }
        return result.toArray(new int[result.size()][2]);
    }
}
相關文章
相關標籤/搜索