当前位置: 首页 > article >正文

★ 算法OJ题 ★ 前缀和算法(下)

Ciallo~(∠・ω< )⌒☆ ~ 今天,将继续和大家一起做几道前缀和算法题 ~

❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️

澄岚主页:椎名澄嵐-CSDN博客

算法专栏:★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客

❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️


目录

壹  和为k的子数组

1.1 题目

1.2 算法解析

1.3 撰写代码

贰  和可被K整除的子数组

2.1 题目

2.2 算法解析

2.3 撰写代码

叁  连续数组

3.1 题目

3.2 算法解析

3.3 撰写代码

肆  矩阵区域和

4.1 题目

4.2 算法解析

4.3 撰写代码


壹  和为k的子数组

1.1 题目

https://leetcode.cn/problems/subarray-sum-equals-k/description/

1.2 算法解析

1.3 撰写代码

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int , int> hash; // 记录前缀和出现次数
        hash[0] = 1;
        int sum = 0, ret = 0; // sum记录前缀和
        for (auto x : nums)
        {
            sum += x; // 计算当前位置的前缀和
            if (hash.count(sum - k)) // 统计等于(sum[i] - k)个数
                ret += hash[sum - k];
            hash[sum]++; // 和为sum的前缀和次数++
        }
        return ret;
    }
};


贰  和可被K整除的子数组

2.1 题目

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

2.2 算法解析

2.3 撰写代码

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        unordered_map<int, int> hash;
        hash[0 % k] = 1;
        int sum = 0, ret = 0;
        for (auto x : nums)
        {
            sum += x; // 算出当前位置的前缀和
            int r = (sum % k + k) % k; // 修正后的余数
            if (hash.count(r))
                ret += hash[r]; // 统计结果
            hash[r]++;
        }
        return ret;
    }
};


叁  连续数组

3.1 题目

525. 连续数组 - 力扣(LeetCode)

3.2 算法解析

3.3 撰写代码

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        unordered_map<int, int> hash;
        hash[0] = -1; // 默认有⼀个前缀和为 0 的情况
        int sum = 0, ret = 0;
        for (int i = 0; i < nums.size(); i++)
        {
            int tmp = (nums[i] == 0 ? -1 : 1); // 计算当前位置的前缀和
            sum += tmp; // 算出前缀和
            if (hash.count(sum)) // 前面有同样的sum
                ret = max(ret, i - hash[sum]); // 算距离i - j
            else
                hash[sum] = i; // 前面没有同样的sum则更新下标
        }
        return ret;
    }
};


肆  矩阵区域和

4.1 题目

1314. 矩阵区域和 - 力扣(LeetCode)

4.2 算法解析

  

4.3 撰写代码

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m = mat.size(), n = mat[0].size();
        // 1.预处理一个前缀和矩阵
        vector<vector<int>> dp(m + 1, vector<int>(n + 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] + mat[i - 1][j - 1];
        // 2.使用前缀和矩阵
        vector<vector<int>> ret(m, vector<int>(n));
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                int x1 = max(0, i - k) + 1;
                int y1 = max(0, j - k) + 1;
                int x2 = min(m - 1, i + k) + 1;
                int y2 = min(n - 1, j + k) + 1;
                ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
            }
        return ret;
    }
};



http://www.kler.cn/a/390489.html

相关文章:

  • 随手记:简单实现纯前端文件导出(XLSX)
  • mongoDB的安装及使用
  • 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
  • Hadoop(环境搭建篇)
  • LeetCode【0027】移除元素
  • RHCE web解析、dns配置、firewalld配置实验
  • [OS] 区分按位与()和逻辑与()
  • C# 如何将winform只生成一个绿色文件?
  • 02-1_MVCC版本链清理
  • 手写一些方法
  • Mac保护电池健康,延长电池使用寿命的好方法
  • 十六:Spring Boot依赖 (1)-- spring-boot-starter 依赖详解
  • 捕获抖音截图:如何用Puppeteer保存页面状态
  • linux 通过apt安装软件包时出现依赖包版本不对的问题解决
  • 我谈维纳(Wiener)复原滤波器
  • ChatGPT 通过三种方式帮助我进行学术写作
  • 编程之路,从0开始:练习篇
  • Maven最佳实践
  • 嵌入式ARM平台Linux网络实时性能优化
  • Spring Plugin与策略模式:打造动态可扩展的应用
  • 大数据技术在智慧医疗中的应用
  • 期刊论文查重率多少,才会不被认定为学术不端?
  • CSS的定位(文档流,相对定位,绝对定位,固定定位)
  • Tomcat(4) Tomcat支持哪些版本的Java?
  • PCB板材和适用场合
  • 常见的排序算法及分类对比