假設有打亂順序的一群人站成乙個佇列。 每個人由乙個整數對(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.題目要求進行生成乙個新的序列,那我們要看生成的序列的特徵是什麼。毫無疑問,應該是身高作為優先排序因素,因為身高的大概率在矮的前面,而且一定存在乙個數字[max,0],因為最大數前面是沒有數字的,所以位置一定是0.
2.當我們把第乙個數字按照降序排列之後,我們再來看,對於[7,0]來說,應該插入陣列的最前端。對於[7,1]來說,應該插入在下標為1的地方,對於[4,4]來說,應該插入在下標為4的地方。
3.按照1,2的指導思想,我們寫出:
vector> res(people.size());
for(int i = 0;i < people.size();i++)
res.resize(people.size());
return res;
但是問題來了,insert函式:比如你陣列是空,那麼你無法直接把元素插到第2個位置上。也就是說,插入的節點上原先必須有元素(或者說有預留空間)。我們來看看這段**,一開始插入誰[7,0]還是[7,1]?肯定不可能是[x,i>0],因為如果後面的數字大於0,無法使用insert函式,那一開始插入[7,0]還是[5,0]?當然是[7,0],因為先插入[7.0],因為等下一次按照0插入的時候,[5,0]會自動頂到[7,0]的前面,而這時符合邏輯的,因為7比5大。這裡暗含的邏輯就是,當第二個數字相同時,第乙個數字應該從大到小排列,這樣插入的時候會從下到大排列。
4.按照3的思想,**如下:
class solution );
vector> res(people.size());
for(int i = 0;i < people.size();i++)
res.resize(people.size());
return res;
}};
406 根據身高重建佇列
假設有打亂順序的一群人站成乙個佇列。每個人由乙個整數對 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...
406 根據身高重建佇列
假設有打亂順序的一群人站成乙個佇列。每個人由乙個整數對 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...
406 根據身高重建佇列
假設有打亂順序的一群人站成乙個佇列,陣列people表示佇列中一些人的屬性 不一定按順序 每個people i hi,ki 表示第i個人的身高為hi,前面正好有ki個身高大於或等於hi的人。請你重新構造並返回輸入陣列people所表示的佇列。返回的佇列應該格式化為陣列queue,其中queue j ...