力扣 406. 根据身高重建队列

题目来源:https://leetcode.cn/problems/queue-reconstruction-by-height/description/

C++题解1:分别对h和k两个维度进行考虑,我这里是优先考虑k值,k值相同的时候h小的排前面。然后再一一遍历,对于peoplei,找到比peoplei0大的位置,准备插入peoplej+10,但是插入前还需判断一下插入位置peoplej+10是否大于peoplei0,不是的话就继续往后寻找插入位置。

cpp 复制代码
class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if(a[1] < b[1]) return true;
        else if(a[1] == b[1]) {
            if(a[0] < b[0]) return true;
        }
        return false;
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), cmp);
        int len = people.size();
        for(int i = 0; i < len; i++) {
            int count = people[i][1];
            for(int j = 0; j <= i; j++) {
                if(people[j][0] >= people[i][0]) count--;
                if(count == 0) {
                    if(j+1!=i && people[j+1][0] >= people[i][0]){  // 插入
                        people.insert(people.begin()+j+1, people[i]);
                        people.erase(people.begin()+i+1);
                        break;  // 找到插入的位置就跳出循环
                    } 
                }
            }
        }
        return people;
    }
};

C++题解2(来源代码随想录):优先身高排序,从大到小排(身高相同的话则k小的站前面),让高个子在前面。此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高! 后面只需要按照k为下标重新插入队列就可以了。采用vector实现。

cpp 复制代码
class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        vector<vector<int>> que;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            que.insert(que.begin() + position, people[i]);
        }
        return que;
    }
};

C++题解3(来源代码随想录):使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n^2)了,甚至可能拷贝好几次,就不止O(n^2)了。

vector的大小有两个维度一个是size一个是capicity,size就是我们平时用来遍历vector时候用的,而capicity是vector底层数组(就是普通数组)的大小,capicity可不一定就是size。当insert数据的时候,如果已经大于capicity,capicity会成倍扩容,但对外暴漏的size其实仅仅是+1。扩容时重新申请一个二倍于原数组大小的数组,然后把数据都拷贝过去,并释放原数组内存。

list底层是链表实现,插入效率比vector高的多。

cpp 复制代码
class Solution {
public:
    // 身高从大到小排(身高相同k小的站前面)
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1]; // 插入到下标为position的位置
            std::list<vector<int>>::iterator it = que.begin();
            while (position--) { // 寻找在插入位置
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};
相关推荐
JieE2129 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4563 天前
C++进阶(1)——前景提要
c++