前往
大廳
主題

LeetCode - 406. Queue Reconstruction by Height 解題心得

Not In My Back Yard | 2023-05-28 12:00:08 | 巴幣 0 | 人氣 167

題目連結:


題目意譯:
你被給定一個由人們形成的陣列 people,其代表著一個佇列中某些人的特性(不一定有照任何特定順序)。每一個 people[i] = [hi, ki] 代表第 i 個人有著高度值 hi 並有著恰好有 ki 個有著高度值大於等於 hi 的人站在他前面。

由輸入陣列 people 來重新構造出該佇列並回傳。回傳的佇列之形式應為一陣列 queue,其中 queue[j] = [hj, kj] 為第 j 個人的特性(queue[0] 為站在佇列開頭的人)。

限制:
1 ≦ people.length ≦ 2000
0 ≦ hi ≦ 10 ^ 6
0 ≦ ki < people.length
保證該佇列可以被重新構造出來。



範例測資:
範例 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 且有兩個人更高或相同高度的人站在前面,其為第 0 和 1 個人。
第 3 個人有著高度值 6 且有一個人更高或相同高度的人站在前面,其為第 1 個人。
第 4 個人有著高度值 4 且有四個人更高或相同高度的人站在前面,其為第 0 、 1 、 2 和 3 個人。
第 5 個人有著高度值 7 且有一個人更高或相同高度的人站在前面,其為第 1 個人。
因此,[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 為重新構造出來的佇列。

範例 2:
輸入: people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
輸出: [[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]


解題思維:
由於原本的佇列一定可以被建立出來,因此佇列中開頭的人之特性 [x, y],其 y 之值必定為 0(因為他前面根本沒有人)。

所以這變成了我們的第一條線索(以下以範例 1 為例):
我們把 people[i][1] 是 0 的人抓出來,在這邊是 [7,0] 和 [5,0]。

從上例可以看到候選人可能很多個,那哪個人才是對的?可以看到每個人第二個特性是前面的人之高度「大於或等於」自己。因此如果有多個候選人,則矮的應該要放前面。不然高的在前面會使的矮的人之第二個特性不為 0。

選出第一個人之後,我們可以忽視這個人。因此我們需要更新其他人的第二個特性:當第一個人的高度比某個人的高度一樣或更高時,則將該人的第二個特性之值減去 1。

承上例,我們將選出 [5,0],而 people 變成了 [[7,0],[5,1],[6,1],[4,3],[7,1]](由於答案最後是要保持原有的特性,因此可以額外複製一份原始陣列並用索引值來指涉或是複製一份第二個特性作為第三個特性,然後減少的操作將執行於第三個特性上等等)。

接著我們可以繼續這個步驟直到 people 中沒有人可以選為止。

最後我們便可以根據選的人之順序得到一個佇列,其即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作