1. 程式人生 > >根據身高重建佇列

根據身高重建佇列

假設有打亂順序的一群人站成一個佇列。 每個人由一個整數對(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.身高降序排列,k值升序排列 2.建立一個新的二維陣列,一個個的往裡面插入已排好序的值,策略是:依次按照k的值作為索引插入到相應的位置。

這樣做保證了兩點: 1.相同身高的,k值大的會被插入到k值小的後面。 2.k值相同的,身高矮的被插入到前面。因為已按要求排好序。

其實仔細想想,這也正滿足了題目重建佇列的要求。。。

public int[][] reconstructQueue(int[][] people) {
		if(people == null || people.length==0 || people[0].length == 0)
			return new int[0][0];
		
		Arrays.sort(people, (a,b)->(a[0]==b[0] ? a[1]-b[1] : b[0] - a[0]));
		List<int[]> queue = new ArrayList<int[]>();
		for(int[] p:people) {
			queue.add(p[1], p);
		}
        return queue.toArray(new int[queue.size()][]);
    }