Le 222e jeu hebdomadaire [gourmand, table de hachage, double pointeur, sous-séquence ascendante la plus longue]

5641. Nombre maximum d'unités sur le camion (gourmand)

class Solution {
    
    
public:
    int maximumUnits(vector<vector<int>>& b, int m) {
    
    
        sort(b.begin(), b.end(), [](vector<int> a, vector<int> b){
    
     // lambda表达式
            return a[1] > b[1];
        });

        int res = 0;
        for(int i = 0;i < b.size() && m > 0; i ++ )
        {
    
    
            int cur = min(b[i][0],m);
            res += cur * b[i][1];
            m -= cur;
        }
        return res;
    }
};

5642. Nombre de repas (énumération + table de hachage)

Analyse:
a [i] + a [j] = 2 k 2 ^ {k}2k , fixez j, c'est-à-dire combien de nombres dans 1 ~ j satisfont2 k - a [j] 2 ^ {k} -a [j]2k-a [ j ] , utilisez une table de hachage. 2 k 2 ^ {k}2k dénombrement direct, complexité temporelleO(22n)

class Solution {
    
    
public:
    int countPairs(vector<int>& d) {
    
    
        unordered_map<int,int> hash;
        
        int res = 0, mod = 1e9 + 7;
        for(auto x : d)
        {
    
    
            for(int i = 0;i <= 21; i ++ ) // 2的幂直接枚举,枚举到21!
            {
    
    
                int t = (1 << i) - x;
                if(hash.count(t)) res = (res + hash[t]) % mod;
            }
            hash[x] ++;
        }
        return res;
    }
};

5643. Le nombre de schémas pour diviser le tableau en trois sous-tableaux (préfixe et + double pointeur)

Analyse:
Il y a monotonie, les deux doubles pointeurs sont combinés, et la frontière n'est pas facile à écrire!时间复杂度O(n)

class Solution {
    
    
public:
    int waysToSplit(vector<int>& nums) {
    
    
        int n = nums.size();
        vector<int> s(n + 1);
        for(int i = 1;i <= n ;i ++ ) s[i] = s[i - 1] + nums[i - 1]; // 前缀和下标从1开始

        int res = 0, mod = 1e9 + 7;
        for(int i = 3, j = 2, k = 2;i <= n; i ++ )
        {
    
    
            while(s[n] - s[i - 1] < s[i - 1] - s[j - 1]) j ++ ;
            while(k + 1 < i && s[i - 1] - s[k] >= s[k]) k ++ ;
            if(j <= k && s[n] - s[i - 1] >= s[i - 1] - s[j - 1] && s[i - 1] - s[k - 1] >= s[k - 1])
                res = (res + k - j + 1) % mod;
        }
        return res;
        
    }
};

5644. Le nombre minimum d'opérations pour obtenir la sous-séquence (gourmande + sous-séquence ascendante la plus longue)

Analyse: la
plus longue sous-séquence commune est transformée en la plus longue sous-séquence ascendante, et la longueur de la plus longue sous - séquence ascendante est gourmande, AcWing 896. La plus longue sous-séquence ascendante II [gourmande, optimisation binaire] , complexité en tempsO(nlogn)

class Solution {
    
    
public:
    int minOperations(vector<int>& target, vector<int>& arr) {
    
    
        unordered_map<int,int> pos;
        for(int i = 0; i< target.size();i ++ )
            pos[target[i]] = i;
        
        vector<int> a;
        for(auto x : arr)
            if(pos.count(x))
                a.push_back(pos[x]);
        
        // 贪心求最长上升子序列长度,模板背过!
        int len = 0;
        vector<int> q(a.size() + 1);
        for(int i = 0;i < a.size(); i++ )
        {
    
    
            int l = 0, r = len;
            while(l < r){
    
    
                int mid = l + r  + 1>> 1;
                if(q[mid] < a[i]) l = mid;
                else r = mid - 1;
            }
            len = max(len, r + 1);
            q[r + 1] = a[i];
        }
        return target.size() -  len;
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43154149/article/details/112133764
conseillé
Classement