LC周赛298

5242. 兼具大小写的最好英文字母

        首先遍历字符串,利用哈希表存储每个字母是否出现。然后从字母z开始向前遍历,每次判断是否同时出现字母的大小写,如果出现则返回答案。

class Solution {
public:
    unordered_map<char,int> map;    
    string greatestLetter(string s) {
        string res; //返回值
        for(auto &c : s) {  //保存每个字母出现的次数
            map[c]++;
        }
        for(char c = 'z';c >= 'a';c--) {    //从z向前遍历,返回第一个出现大小写的字母
            if(map.count(c) && map.count(c - 32)) {
                return string(1, c - 32);
            }
        }
        return res;
    }
};

2310. 个位数字为 K 的整数之和

每个个位数为k的数都可以拆分成一个对10取余为0的整数和k,比如 sum = 58 ,k = 9;

sum = 39 + 19  = (30 + 9) + (10 + 9),因此题目转化为sum - i * k 是否能整除k。

class Solution {
public:
    int minimumNumbers(int num, int k) {
        if(num == 0) return 0; 
        for(int i = 1;i <= num;i++) {
            int t = num - i * k;
            if(t >= 0 && t % 10 == 0) return i;
        }       
        return -1;
    }
};

2311. 小于等于 K 的最长二进制子序列

贪心:参考题解力扣https://leetcode.cn/problems/longest-binary-subsequence-less-than-or-equal-to-k/solution/by-nopenope-txbj/

class Solution {
public:
    int longestSubsequence(string s, int k) {
        int res = 0;
        for(auto &x : s) {
            if(x == '0') res++;
        }        
        long long ans = 0,w = 1;
        for(int i = s.length() - 1;i >= 0;i--,w <<= 1) {
            if(s[i] == '1') ans += w;
            if(ans > k) return res;
            if(s[i] == '1') res++;
            if(w > 2e9) return res; //处理溢出
        }
        return res;
    }
};

2312. 卖木头块 

dp

typedef long long LL;
class Solution {
public:
    long long sellingWood(int m, int n, vector<vector<int>>& prices) {
        vector<vector<LL>> dp(m + 1, vector<LL> (n + 1));
        //dp[i][j]表示高度为i,宽度为j的木块分割的最大价值
        //有两种分割方式,垂直和水平。
        //垂直:dp[i][j] = dp[i][k] + dp[i][j - k];  k < j
        //水平:dp[i][j] = dp[k][j] + dp[i - k][j];  k < i     
        //再取最大值

        for(auto &p : prices) {
            int h = p[0],w = p[1],v = p[2];
            dp[h][w] = v;   //初始化
        } 

        for(int i = 1;i <= m;i++)
            for(int j = 1;j <= n;j++) { //水平
                for(int k = 1;k < i;k++) {
                    dp[i][j] = max(dp[i][j], dp[k][j] + dp[i - k][j]);
                }
                for(int k = 1;k < j;k++) {
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[i][j - k]);
                }
            }
        return dp[m][n];
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值