第 359 场周赛

本文介绍了四个编程问题,涉及字符串操作(首字母缩略词判断)、数组优化(k-避免数组最小总和)、动态规划在销售利润最大化中的应用以及最长等值子数组的双指针解决方案。
摘要由CSDN通过智能技术生成

第 359 场周赛

2828. 判别首字母缩略词

思路:遍历
取出每个单词的首字母,并和所给字符串匹配即可

class Solution {
public:
    bool isAcronym(vector<string>& words, string s) {
        string S="";
        for(int i=0;i<words.size();i++)S+=words[i][0];
        return S==s;
    }
    
};

2829. k-avoiding 数组的最小总和

思路:暴力
以下标1开始从左到右,依次找到 i 并把 k-i 标记表示不能再选 k-i 这个数,然后计算前 n 个数的和即可

class Solution {
public:
    int minimumSum(int n, int k) {
        map<int,int>st;

        int l=0,S=1,res=0;
        
        while(l<n){
            if(st[S]){
                 S++;
                continue;
            }
            l++;
            st[k-S]=1;
            res+=S;
            S++;
        }
        return res;
    }
};

2830. 销售利润最大化

思路: 动态规划
1,设状态 f(i) 表示遍历了 [1,i] 的房屋后,可以赚取的金币的最大数目。预处理每个位置上,以这个位置为终点的 offer 的下标。注意 ii 的有效下标范围是 [1,n]
2,初始时 f(0)=0,其余待定。
3,转移时,可以转移 f(i)=f(i−1),表示不出售第 i 个房屋。接着枚举以 ii 为终点的 offer(x)offer(x),转移 f(i)=max(f(i),f(offer(x,0)−1)+offer(x,1))。(代码中无需对 offer(x,0) 进行减一,因为给定的位置下标范围是从 0 开始的。)
4,最终答案为 f(n)。

class Solution {
public:
    int maximizeTheProfit(int n, vector<vector<int>>& w) {
        int m = w.size();
        vector<int> f(n + 1);
        vector<vector<int>> g(n);
        for (int i = 0; i < m; i ++ ) {
            g[w[i][1]].push_back(i);
        }
        for (int i = 1; i <= n; i ++ ) {
            f[i] = f[i - 1];
            for (int j: g[i - 1]) {
                f[i] = max(f[i], f[w[j][0]] + w[j][2]);
            }
        }

        return f[n];
    }
};

2831. 找出最长等值子数组

思路:双指针
1,我们可以枚举数字,判定这个数字可构成的最长等值子数组的长度。
2,预处理每个数字出现的所有下标。
3,枚举每个数字,然后找到去掉 小于等于k个数能够到达的最大的距离

class Solution {
public:
    int longestEqualSubarray(vector<int>& nums, int k) {
        int n = nums.size();
        vector<vector<int>> p(n + 1);
        for (int i = 0; i < n; i ++ ) {
            p[nums[i]].push_back(i);
        }
        int res = 0;
        for (int u = 1; u <= n; u ++ ) {
            auto& q = p[u];
            for (int i = 0, j = 0; i < q.size(); i ++ ) {
                while ((q[i] - q[j]) - (i - j) > k) j ++ ;
                res = max(res, i - j + 1);
            }
        }
        return res;
    }
};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linkk_bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值