题目
找规律
这种排队列的题,基本上都跟排序有关,因此先对原始序列排个序:
- 找规律,发现队列基本上是按照 k i k_i ki 排的;
- 当 k i k_i ki 相同时,考虑将矮个子放在前面;
找完了大致的规律,现在来考虑细节。考虑到队列的顺序不光是跟身高有关,还跟 k i k_i ki 有关,那么我们就将上面序列一个一个往队列中插:
- 首先插入 [5,0]
- 然后插入 [7,0] ,发现 [7,0] 意味着其前方没有比它大的数,那么就将它排在当前队列从头开始第一个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0]
- 然后插入 [6,1] ,发现 [6,1] 意味着其前方有一个比它高(或相等)的人,那么就将它排在第二个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0], [6,1]
- 然后插入 [7,1] ,根据规律,将其排在第二个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0], [6,1], [7,1]
- 然后插入 [5,2] ,根据规律,将其排在第三个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0], [5,2], [6,1], [7,1]
- 后续操作相同,发现结果满足规律。
class Solution {
public:
static bool cmp(const vector<int> &q, const vector<int> &p) {
if(q[1] == p[1])
return q[0] < p[0];
return q[1] < p[1];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
vector<vector<int>> ans;
ans.push_back(people[0]);
for(int i = 1; i < people.size(); ++i) {
int flag = 0;
for(int j = 0;; ++j) {
if(j == ans.size()) {
ans.push_back(people[i]);
break;
}
if(ans[j][0] >= people[i][0])
flag++;
if(flag == people[i][1] + 1) {
ans.insert(ans.begin() + j, people[i]);
break;
}
}
}
return ans;
}
};