【LeetCode】第 78 场双周赛题解

121 阅读1分钟

5299. 找到一个数字的 K 美丽值

字符串处理

class Solution {
public:
    int divisorSubstrings(int num, int k) {
        string s = to_string(num);
        int res = 0;
        for(int i=0; i+k <= s.size(); i++){
            string t = s.substr(i, k);
            int u = stoi(t);
            if(u > 0 && num%u == 0){
                res++;
            }
        }
        return res;
    }
};

6067. 分割数组的方案数

前缀和,枚举

class Solution {
public:
    int waysToSplitArray(vector<int>& nums) {
        int n = nums.size();
        vector<long long> f(n+1);
        for(int i=1; i<=n; i++){
            f[i] = f[i-1] + nums[i-1];
        }
        int res = 0;
        for(int i=1; i<n; i++){
            if(f[i] >= f[n]-f[i]){
                res++;
            }
        }
        return res;
    }
};

6068. 毯子覆盖的最多白色砖块数

排序 + 双指针

class Solution {
public:
    int maximumWhiteTiles(vector<vector<int>>& tiles, int carpetLen) {
        sort(tiles.begin(), tiles.end());
        int l = 0, r = 0, sum = 0, res = 0, n = tiles.size();
        while(r < n){
            int left = tiles[l][0], right = left+carpetLen-1;
            if(tiles[r][1] <= right){
                sum += tiles[r][1] - tiles[r][0]+1;
                res = max(res, sum);
                r++;
            }else{
                if(tiles[r][0] < right){
                   res = max(res, sum + right - tiles[r][0] + 1); 
                }
                sum -= tiles[l][1] - tiles[l][0]+1;
                l++;
            }
        }
        return res;
    }
};

6069. 最大波动的子字符串

中文翻译有问题,建议看一下英文题目,至少包含2个不同字母,最多字母数和最少字母数差最大, 相同字母,最大和最小相同,所以波动为0, 枚举2个字母从 a-z 组合,统计子字符串最大值。

class Solution {
public:
    int largestVariance(string s) {
        int res = 0;
        for(char a = 'a'; a<='z'; a++){
            for(char b ='a'; b<='z'; b++){
                int diff = 0, diff_b = -s.size();// 考虑全部为同一个字母的情况,为 0
                for(char c : s){
                    if(c == a){
                        diff ++ ;
                        diff_b++;
                    }else if(c == b){
                        diff --;
                        diff_b = diff;
                        diff = max(diff, 0);
                    }
                    res = max(res, diff_b);
                }
            }
        }
        return res;
    }
};