leetcode第 109 场双周赛

发布时间 2023-07-23 18:54:16作者: Ke_scholar

6930. 检查数组是否是好的 - 力扣(LeetCode)

首先判断数组长度是不是最大值 + 1, 然后排个序,判断0到n - 2是不是都是1到最大值的一个排列,满足这些返回true就行了

class Solution {
public:
    bool isGood(vector<int>& num) {
        int ma = 0;
        for(auto i : num){
            ma = max(ma,  i);
        }
        
        if(ma + 1!= num.size())
            return false;
        
        sort(num.begin(), num.end());
        
        for(int i = 0;i < num.size() - 2;i ++){
            if(num[i] + 1 != num[i + 1])
                return false;
        }
        
        return true;
        
    }
};

6926. 将字符串中的元音字母排序 - 力扣(LeetCode)

先把s里的元音字母取出来,然后排序,最后替换掉s中的元音字母即可

class Solution {
public:
    string sortVowels(string s) {
    string os = "";
    string yuan = "aeiouAEIOU";

    for(auto i : s ){
        if(yuan.find(i) != -1){
            os += i;
        }
    }

    sort(os.begin(),os.end());

    int cnt = 0;
    for(int i = 0;i < s.size();i ++){
        if(yuan.find(s[i]) != -1){
            s[i] = os[cnt++];
        }
    }
        return s;
    }
};

6931. 访问数组中的位置使分数最大 - 力扣(LeetCode)

\(i\)可以跳掉任意\(i < j\)\(j\)的位置,要使得\(i\)处分数最大,则就是求\(j\)处的分数最大,所以我们可以从最后转移到初始位置,分别从奇数和偶数转移

class Solution {
public:
    long long maxScore(vector<int>& nums, int x) {
        long long n = nums.size();
        vector<vector<long long>> dp(2, vector<long long> (n , 0));

        dp[nums[n - 1] & 1][n - 1] = nums[n - 1];
        dp[!(nums[n - 1] & 1)][n - 1] = max(0,nums[n - 1] - x);

        for(long long i = n - 2;i >= 0;i --){
            dp[0][i] = dp[0][i + 1];
            dp[1][i] = dp[1][i + 1];

            dp[nums[i] & 1][i] += nums[i];

            dp[0][i] = max(dp[0][i], dp[1][i] - x);
            dp[1][i] = max(dp[1][i], dp[0][i] - x);

        }

        return dp[nums[0] & 1][0];

    }
};

6922. 将一个数字表示成幂的和的方案数 - 力扣(LeetCode)

01 背包模板题。把正整数的 \(x\) 次幂看成一个物品,求的就是把 \(n\) 件物品凑成 \(n\) 的方案数。复杂度 \(\mathcal{O}(n^2)\)

class Solution {
public:
    int numberOfWays(int n, int x) {

        const int mod = 1e9 + 7;
        vector<int> p(n + 1);
        for(int i = 1;i <= n;i ++){
            long long res = pow(i, x);
            p[i] = res % mod;
        }

        vector<int> dp(n + 1);
        dp[0] = 1;

        for(int i = 1;i <= n;i ++){
            for(int j = n;j >= p[i];j--){
                dp[j] = (dp[j] + dp[j - p[i]]) % mod;
            }
        }

        return dp[n];
    }
};