Leetcode406. 根據身高重建隊列[Med] -JAVA

題目傳送門

Leetcode406. 根據身高重建隊列[Med] -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]]

思路

k是排在這個人前面且身高大於或等於h的人數
因爲people[i][1] 表示在我(i)前面需要比我(i)高的人的個數,那我先不管3721,反正大家想要前面都比自己高的,直接按照從高到矮(大到小)的順序排一遍先。
如果相同的高度就按個數的小-大排,這個應該很好理解,越排後面那我前面就多點人,這樣之後還沒完。

待排好後再做個調整,按照people[i][1]的順序重組一個數數組,相同位置就插在這個位置的人的前面。這裏用了List.add(index,element)這個方法可以實現。
因爲當前的數肯定是比前面小或者等於前面,前面的數已有了它該有的位置,那這些在不破壞規則的情況下,當前的值選擇插在前面。

完成!

ps:List.add(index,element)實現的關鍵代碼System.arraycopy(elementData, index, elementData, index + 1,size - index)
即重新複製一份數組,把index+1 後面的元素後移動,騰出一個新位置給新元素。

栗子:
走一波程序!!!
數組:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
第一步排好之後會變成這樣: [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
第二步: 新數組List []
第一個[7,0] ,位置爲index =0 , 數組有了第一個元素:[[7,0]]
第二個[7,1] ,位置爲index =1 , 數組有了第二個元素:[[7,0],[7,1]]
第三個[6,1] ,位置爲index =1 , 數組有了第三個元素:[[7,0],[6,1],[7,1]]
第四個[5,0] ,位置爲index =0 , 數組有了第四個元素:[[5,0],[7,0],[6,1],[7,1]]
第五個[5,2] ,位置爲index =2 , 數組有了第五個元素:[[5,0],[7,0],[5,2],[6,1],[7,1]]
第六個[4,4] ,位置爲index =4 , 數組有了第六個元素:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

解法

貪心算法

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        if(people.length==0|| people[0].length==0) return new int[0][0];
        Arrays.sort(people, (o1, o2) -> o1[0]==o2[0]?o1[1]-o2[1]:o2[0]-o1[0]); // java8後lamda寫法,等價於new Competitor<>(){...}

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

        return res.toArray(new int[res.size()][]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章