【LeetCode】406-根據身高重建隊列



title: 406-根據身高重建隊列
date: 2019-04-15 21:13:06
categories: LeetCode
tags:

  • Java容器
  • 比較器
  • 貪心思想

題目描述

假設有打亂順序的一群人站成一個隊列。 每個人由一個整數對(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]]

解題思路

一開始還不太理解題目的意思,想了一會兒才搞懂。是這個意思:一群人本來期望是按輸出那樣排列的,但是現在被打亂了,但是每個人的數組都還是原有的信息,希望找到一種算法能把這個打亂的隊列(輸入)還原成期望的排列(輸出)。

算法可以按以下步驟進行:

  1. 先把這一群人按某種順序排列
  2. 依據上述的順序,加入到一個新的集合達成重新排列

1 中所說的某種順序,根據題目要求應該為身高降序,也就是說先考慮把身高較高的人放入新集合,這樣在高個子前面或后面插入矮個子都不會影響當前高個子的k值;其次,k值應該升序排列,k值較大的較后插入。

按 1 中排好的順序,將每個元素插入隊列的第k個位置。

Java 實現

public int[][] reconstructQueue (int[][] people) {
    Arrays.sort(people, new Comparator<int[]>() {
        @Override
        public int compare (int[] o1, int[] o2) {
            return o1[0] == o2[0] ? o1[1] - o2[1]:o2[0] - o1[0];
        }
    });

//        for (int[] person : people) {
//            System.out.println(Arrays.toString(person));
//        }

    List<int[]> queue = new ArrayList<>();
    for (int[] person : people) {
        queue.add(person[1],person);
    }

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

心得體會

  1. 比較器Comparator的構造
  2. 貪心思想的運用
  3. 集合 api 的運用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM