1. 题目来源
2. 题目说明
3. 题目解析
太难了…
- 身高高的人只会看到比他高的人,所以当身高高的人固定好了位置,前面插入多少个矮的人都不会破坏高的人的条件限制
- 所以应该先决定高的人的位置,再决定矮的人的位置;高的人限制条件少,矮的人限制条件多。
先按身高从大到小排序,身高一样则按照 k
排序:身高大或 k
小意味着限制条件少,应该被优先考虑。
依次插入元素:由上一点,先进入 res
的元素不会被后进入的元素影响,因此每一次插入只需要考虑自己不需要考虑别人。当遍历到元素 [a,b]
的时候,比它大的元素已经进组,比它小的元素还没进组,那么它应该插到 res
的第 b
位,从而实现 0 到 b-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]]
-
插入 [7,0], res=[[7,0]]
-
插入[7,1], res=[[7,0],[7,1]]
-
插入[6,1], res=[[7,0],[6,1],[7,1]]
-
插入[5,0], res=[[5,0],[7,0],[6,1],[7,1]]
-
插入[5,2], res=[[5,0],[7,0],[5,2],[6,1],[7,1]]
-
插入[4,4], res=[[5,0],[7,0],[5,2],[4,4],[6,1],[7,1]]
-
最终答案是 [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
代码:
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), [](const vector<int> &a, const vector<int> &b) {
if (a[0] != b[0]) return a[0] > b[0];
return a[1] < b[1];
});
vector<vector<int>> res;
for (auto e : people) res.insert(res.begin() + e[1], e);
return res;
}
};
貌似还有个 树状数组+二分 的操作,不会。有兴趣可取看题解区。