代码随想录——贪心算法:根据身高重建队列 & Vector原理

image
image
image

代码

class Solution {
public:

    static bool cmp(vector<int>& a,vector<int>& b){
        if(a[0] == b[0])return a[1]<b[1];//如果身高相同,k更小的在前面
        return a[0] > b[0];//身高不同就从高到低
    }
    // 1.数组
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
         //有两个属性的贪心。只能先确定一个,不能同时考虑
         //这里先确定身高从高到低。再按照k插在前面。因为后面的人身高比前面的人矮,不会影响前面已经排好了的k
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>> ans;//不能直接插在people后
        for(int i=0;i<people.size();i++){
            ans.insert(ans.begin() + people[i][1],people[i]);
        }
        return ans;
    }

    // //2.链表
    // vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
    //     //有两个属性的贪心。只能先确定一个,不能同时考虑
    //     //这里先确定身高从高到低。再按照k插在前面。因为后面的人身高比前面的人矮,不会影响前面已经排好了的k
    //     sort(people.begin(),people.end(),cmp);
    //     list<vector<int>> ans;
    //     for(int i=0;i<people.size();i++){
    //         int pos = people[i][1];
    //         auto it = ans.begin();
    //         while(pos--){
    //             it++;
    //         }
    //         ans.insert(it,people[i]);
    //     }
    //     return vector<vector<int>>(ans.begin(),ans.end());
    // }
};

数组和链表的代码看上去都是O(n^2)的复杂度。但实际运行时间却不同:
image
2和4是链表,1、3和6是数组。
原因是vector每次insert时,如果size超过capicity了,其会扩容并全量拷贝一次。

Vector原理

image
image

posted @ 2024-12-23 10:41  NeroMegumi  阅读(1)  评论(0编辑  收藏  举报