【LeetCode】第 294 场周赛题解

205 阅读1分钟

6074. 字母在字符串中的百分比

统计字符数量/总数量

class Solution {
public:
    int percentageLetter(string s, char letter) {
        int n = s.size(), cnt = 0;
        for(auto& c : s){
            if(letter == c) cnt++;
        }
        return (cnt*100)/n;
    }
};

6075. 装满石头的背包的最大数量

贪心题, 计算背包中的剩下的空间,剩下的空间从小到大排序,增加的石子数减去。

class Solution {
public:
    int maximumBags(vector<int>& c, vector<int>& r, int a) {
        int n = c.size();
        vector<int> s;
        int res = 0;
        for(int i=0; i<n; i++){
            if(c[i] - r[i] > 0){
                s.push_back(c[i]-r[i]);
            }else res++;
        }
        sort(s.begin(), s.end());
        for(int i=0; i<s.size(); i++){
           int t = min(s[i], a);
           s[i] -= t;
           a -= t;
        }
        for(int i=0; i<s.size(); i++){
            if(s[i] == 0) res++;
        }
        return res;
    }
};

6076. 表示一个折线图的最少线段数

枚举, 注意精度问题, 这里是化简为最简分数比较

class Solution {
public:
    int minimumLines(vector<vector<int>>& s) {
        int n = s.size();
        if(n == 1) return 0;
        if(n == 2) return 1; // 两天确定一条直线
        sort(s.begin(), s.end());
        int res = 1;
        for(int i=2; i<n; i++){
            int x1 = s[i-1][0] - s[i-2][0], y1 = s[i-1][1] - s[i-2][1];
            int x2 = s[i][0] - s[i-1][0], y2 = s[i][1] - s[i-1][1];
            int g = __gcd(x1, y1);
            x1 /= g, y1 /= g;
            g = __gcd(x2, y2);
            x2 /= g, y2 /= g;
            if(x1 != x2 || y1 != y2) res++;
        }
        return res;
    }
};

6077. 巫师的总力量和

通过每一个数组的贡献来计算,以 a[i]a[i] 最为最小值,最左边小于等于 a[i]a[i] 的第一个位置 ll 和最右边的大小a[i]a[i] 的第一个位置 rr.
给定 l,i,rl, i, r, l<=i<=rl <= i <= r,s为前缀和, ss为前缀和的前缀和 求:
r=i+1R+1l=Lis[r]s[l]\sum_{r=i+1}^{R+1}\sum_{l=L}^{i} s[r] - s[l]

=r=i+1R+1(iL+1).s[r]l=Lis[l]\sum_{r=i+1}^{R+1} (i-L+1).s[r] - \sum_{l=L}^{i}s[l]

=(iL+1).r=i+1R+1s[r](Ri+1).l=Lis[l](i-L+1).\sum_{r=i+1}^{R+1} s[r] - (R-i+1).\sum_{l=L}^{i}s[l]

=(iL+1).(ss[R+2]ss[i+1])(Ri+1).(ss[i]ss[L])(i-L+1).(ss[R+2]-ss[i+1]) - (R-i+1).(ss[i]-ss[L])

单调栈 + 前缀和

class Solution {
public:
    int totalStrength(vector<int>& s) {
        int mod = 1e9+7;
        int n = s.size();
        vector<int> left(n, -1), right(n, n);
        stack<int> st;
        for(int i=0; i<n; i++){
            while(!st.empty() && s[st.top()] >= s[i]){
                right[st.top()] = i;
                st.pop();
            }
            if(!st.empty()){
                left[i] = st.top();
            }
            st.push(i);
        }
        long long sum = 0L;
        vector<int> ss(n+2);

        for(int i=1; i<=n; i++){
            sum += s[i-1];
            ss[i+1] = (ss[i]+sum)%mod;
        }
        int res = 0;
        for(int i=0; i<n; i++){
            long l = left[i]+1, r = right[i]-1;
            long total = ((i-l+1)*(ss[r+2]-ss[i+1]) - (r-i+1)*(ss[i+1]-ss[l]))%mod;
            res = (res + total*s[i])%mod;
        }
        return (res+mod)%mod;
    }
};