Leetcode406:根據身高重建佇列
題目描述:
假設有打亂順序的一群人站成一個佇列,陣列 people 表示佇列中一些人的屬性(不一定按順序)。每個 people[i] = [hi, ki] 表示第 i 個人的身高為 hi ,前面 正好 有 ki 個身高大於或等於 hi 的人。
請你重新構造並返回輸入陣列people 所表示的佇列。返回的佇列應該格式化為陣列 queue ,其中 queue[j] = [hj, kj] 是佇列中第 j 個人的屬性(queue[0] 是排在佇列前面的人)。
示例 1:
輸入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
輸出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解釋:
編號為 0 的人身高為 5 ,沒有身高更高或者相同的人排在他前面。
編號為 1 的人身高為 7 ,沒有身高更高或者相同的人排在他前面。
編號為 2 的人身高為 5 ,有 2 個身高更高或者相同的人排在他前面,即編號為 0 和 1 的人。
編號為 3 的人身高為 6 ,有 1 個身高更高或者相同的人排在他前面,即編號為 1 的人。
編號為 4 的人身高為 4 ,有 4 個身高更高或者相同的人排在他前面,即編號為 0、1、2、3 的人。
編號為 5 的人身高為 7 ,有 1 個身高更高或者相同的人排在他前面,即編號為 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新構造後的佇列。
對於此題可以使用貪心:
先進行身高從高到矮的排序,然後根據k值插入具體位置(由於從高到矮,那麼較矮的陣列為插入到準確的位置,而較高的陣列會因為矮陣列的插入不斷偏離位置)。
class Solution { public int[][] reconstructQueue(int[][] people) { if(people.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<>(); for(int[] p:people){ queue.add(p[1],p); } return queue.toArray(new int[queue.size()][]); } }
PS:
使用Arrays.sort()進行排序時,出現Arrays.sort(arr, (a, b) -> a - b)時,一個引數是待排序的陣列,另一個引數是Comparator物件,用lamada表示式替代。
Arrays.sort(arr, (a, b) -> a - b)
是對陣列進行氣泡排序
如果 a - b>0 則b 在前 a 在後、直到有序
Arrays.sort(people, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]));
加入了三維表示式,是對二維陣列中下標為0的數進行判斷,如果相等,根據下標為1的數進行冒泡;如果不相等,根據下標為0的數進行冒泡。從小到大。
List.add(int index,E element)可以根據index指定的具體位置插入element。