365天挑战LeetCode1000题——Day 102 Airwallex 空中云汇 & 力扣周赛 公因子的数目 沙漏的最大总和 最小 XOR 对字母串可执行的最大删除数

本文介绍了两个具体的算法问题解决方案:计算两个整数的公因子数量及在二维网格中寻找具有最大总和的沙漏形状。通过详细的代码实现,展示了如何高效解决这些常见算法挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公因子的数目

在这里插入图片描述

代码实现

class Solution {
public:
    int commonFactors(int a, int b) {
        int cnt = 0;
        int maxNum = min(a, b);
        for (int i = 1; i <= maxNum; i++) {
            if (!(a % i) && !(b % i)) cnt++;
        }
        return cnt;
    }
};

沙漏的最大总和

在这里插入图片描述

代码实现(前缀和)

class Solution {
public:
    int maxSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<long long>> dp(m, vector<long long>(n));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dp[i][j] = grid[i][j];
            }
        }
        for (int i = 1; i < m; i++) {
            dp[i][0] += dp[i - 1][0];
        }
        for (int j = 1; j < n; j++) {
            dp[0][j] += dp[0][j - 1];
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
                // cout << i << " " << j << " " << dp[i][j] << endl;
            }
        }
        long long answer = 0;
        for (int i = 2; i < m; i++) {
            for (int j = 2; j < n; j++) {
                if (i == 2 && j == 2) {
                    answer = max(answer, dp[i][j] - grid[i - 1][j] - grid[i - 1][j - 2]);
                    // cout << dp[i][j] << " " << grid[i - 1][j] << " " << grid[i - 1][j - 2];
                    continue;
                }
                if (i == 2) {
                    answer = max(answer, dp[i][j] - dp[i][j - 3] - grid[i - 1][j] - grid[i - 1][j - 2]);
                    continue;
                }
                if (j == 2) {
                    answer = max(answer, dp[i][j] - dp[i - 3][j] - grid[i - 1][j] - grid[i - 1][j - 2]);
                    continue;
                }
                answer = max(answer, dp[i][j] - dp[i - 3][j] - dp[i][j - 3] + dp[i - 3][j - 3]
                             - grid[i - 1][j] - grid[i - 1][j - 2]);
            }
        }
        return answer;
    }
};

最小 XOR

在这里插入图片描述

代码实现

class Solution {
public:
    int minimizeXor(int num1, int num2) {
        int tmp1 = num1, tmp2 = num2;
        int cnt1 = 0, cnt2 = 0;
        while (tmp1) {
            if (tmp1 & 1) cnt1++;
            tmp1 = tmp1 >> 1;
        }
        while (tmp2) {
            if (tmp2 & 1) cnt2++;
            tmp2 = tmp2 >> 1;
        }
        // cout << cnt1 << " " << cnt2 << endl;
        int shiftLeft = 30;
        int ans = 0;
        while (cnt1-- && cnt2--) {
            while (((1 << shiftLeft) & num1) == 0) shiftLeft--;
            ans += (1 << shiftLeft);
            // cout << shiftLeft << endl;
            shiftLeft--;
        }
        if (cnt2 < 0) return ans;
        // cout << cnt2;
        shiftLeft = 0;
        while (cnt2--) {
            // cout << ((1 << shiftLeft) & num1) << endl;
            while (((1 << shiftLeft) & num1) != 0) shiftLeft++;
            ans += (1 << shiftLeft);
            // cout << shiftLeft << endl;
            shiftLeft++;
        }
        return ans;
    }
};

对字母串可执行的最大删除数

在这里插入图片描述

代码实现

class Solution {
private:
    unordered_map<string, int> mp;
public:
    int deleteString(string s) {
        int i;
        for (i = 0; i < s.size(); i++) {
            if (s[i] != s[0]) {
                break;
            }
        }
        if (i == s.size()) return s.size();
        if (s.empty()) return 0;
        if (mp.count(s)) return mp[s];
        int maxCnt = 1;
        for (int i = 1; i <= s.size() / 2; i++) {
            if (s.substr(0, i) == s.substr(i, i)) {
                maxCnt = max(maxCnt, deleteString(s.substr(i)) + 1);
            }
        }
        mp[s] = maxCnt;
        return maxCnt;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值