【leetcode】前缀和

这篇具有很好参考价值的文章主要介绍了【leetcode】前缀和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内容摘抄自: 小而美的算法技巧:前缀和数组 | labuladong 的算法小抄

一维数组的前缀和

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展

看这个 preSum 数组,若想求索引区间 [1, 4] 内的所有元素之和,
就可以通过 preSum[5] - preSum[1] 得出。

class NumArray {
    private:
        // 前缀和数组
        vector<int> preSum;
    
    public:
        /* 输入一个数组,构造前缀和 */
        NumArray(vector<int>& nums) {
            // preSum[0] = 0,便于计算累加和
            preSum.resize(nums.size() + 1);
            // 计算 nums 的累加和
            for (int i = 1; i < preSum.size(); i++) {
                preSum[i] = preSum[i - 1] + nums[i - 1];
            }
        }
        
        /* 查询闭区间 [left, right] 的累加和 */
        int sumRange(int left, int right) {
            return preSum[right + 1] - preSum[left];
        }
};

二维数组的前缀和

如leetcode 304:

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展

注意任意子矩阵的元素和可以转化成它周边几个大矩阵的元素和的运算:

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展

 而这四个大矩阵有一个共同的特点,就是左上角都是 (0, 0) 原点。

那么做这道题更好的思路和一维数组中的前缀和是非常类似的,我们可以维护一个二维 preSum 数组,专门记录以原点为顶点的矩阵的元素之和,就可以用几次加减运算算出任何一个子矩阵的元素和:

值得注意的是 preSum数组要比matrix数组半圈,大出来的这半圈默认为值为0。
同时 再求preSum的时候 要捋清楚和matrix 索引的对应关系

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展

class NumMatrix {
private:
    // 定义:preSum[i][j] 记录 matrix 中子矩阵 [0, 0, i-1, j-1] 的元素和
    vector<vector<int>> preSum;
    
public:
    NumMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        if (m == 0 || n == 0) return;
        // 构造前缀和矩阵
        preSum = vector<vector<int>>(m + 1, vector<int>(n + 1));
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 计算每个矩阵 [0, 0, i, j] 的元素和
                preSum[i][j] = preSum[i-1][j] + preSum[i][j-1] + matrix[i - 1][j - 1] - preSum[i-1][j-1];
            }
        }
    }
    
    // 计算子矩阵 [x1, y1, x2, y2] 的元素和
    int sumRegion(int x1, int y1, int x2, int y2) {
        // 目标矩阵之和由四个相邻矩阵运算获得
        return preSum[x2+1][y2+1] - preSum[x1][y2+1] - preSum[x2+1][y1] + preSum[x1][y1];
    }
};

 笔试真题:蛋糕切割问题(切蛋糕问题)

美团0812秋招笔试真题解析

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展


#include <cstdint>
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
 
class Solution
{
public:
	Solution(vector<vector<int>>& a)
	{
		int n = a.size(); //行
		int m = a[0].size();   //列
		if (!n && !m) return;
		//构造前缀和数组
		preSum = vector<vector<long>>(n + 1, vector<long>(m + 1, 0));
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				//计算每一个矩阵[0,0,i,j]的元素和
				preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] + a[i-1][j-1] - preSum[i - 1][j - 1];
 
	}
 
	long sumRegion(int x1, int y1, int x2, int y2)
	{
		return preSum[x2+1][y2+1] - preSum[x1][y2+1] - preSum[x2+1][y1] + preSum[x1][y1];
	}
 
	int getMin(vector<vector<int>>& a)
	{
		int n = a.size();
		int m = a[0].size();
		int res = INT_MAX;
 
		for (int i = 0; i < m; i++)
		{
			//0,0,n-1,i     0,i+1,n-1,m-1
			long sum1 = sumRegion(0, 0, n - 1, i);
			long sum2 = sumRegion(0, i+1, n - 1, m - 1);
			res = res < abs(sum1-sum2)? res:abs(sum1-sum2);
		}

		for (int j = 0; j < n; j++)
		{
			//0,0,j,m-1     j+1,0,n-1,m-1
			long sum1 = sumRegion(0, 0,  j, m-1);
			long sum2 = sumRegion(j+1, 0, n -1, m - 1);
			res = res < abs(sum1-sum2)? res:abs(sum1-sum2);
		}
	    
		return res;
	}
 
 
private:
 
	//preSum[i][j]用于记录a中子矩阵的元素和
	vector<vector<long>> preSum;
 
};
 
 
 
int main()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> a(n, vector<int>(m, 0));
 
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			cin >> a[i][j];
		}
	Solution MySolution(a);
	cout<< MySolution.getMin(a) << endl;

}

【leetcode】前缀和,leetcode做题心得,leetcode,算法,职场和发展

 文章来源地址https://www.toymoban.com/news/detail-645188.html

到了这里,关于【leetcode】前缀和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 学习平台助力职场发展与提升

    学习平台助力职场发展与提升

    近年来,随着互联网技术的发展, 学习平台 逐渐成为了职场发展和提升的必备工具。学习平台通过提供丰富的课程内容、灵活的学习时间和个性化的学习路径,帮助职场人士更好地提升自己的技能和知识储备,为职场发展打下坚实的基础。 学习平台的优势在于提供了丰富多

    2024年02月11日
    浏览(16)
  • 如何手机搜学法减分答案? #媒体#职场发展

    如何手机搜学法减分答案? #媒体#职场发展

    今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.证件照全能管家(APP) 一个非常好用的证件照APP 常用的证件照尺寸和底色都有、日常的证件照编辑完全够用,支持一键智能拍摄证件照,还可以对照片

    2024年02月19日
    浏览(11)
  • 【职业人生】如何有效的在职场当中避免工作失误和提高个人发展

    【职业人生】如何有效的在职场当中避免工作失误和提高个人发展

         《左传·宣公二年》:“人谁无过,过而能改,善莫大焉。”古往今来,多少人犯过错误。强大如“智绝”的诸葛孔明,也有街亭之失。职场人更是难免会在工作中出现失误。     在职场生涯当中避免不了在工作当中带来的失误,在这过程当中,我们应当要学会怎么去

    2024年02月08日
    浏览(9)
  • [office] excel成绩表格数据排名次的教程 #职场发展#知识分享#媒体

    excel成绩表格数据排名次的教程 Excel 中经常需要使用到 排名 次的技巧,成绩表格数据具体该如何排名呢?接下来是小编为大家带来的excel成绩表格数据排名次的教程,供大家参考。 步骤1:不管在学校还是各个统计领域,排名应用随处可见,如果排序会打乱原有次序,那么好多

    2024年02月21日
    浏览(10)
  • 突破职场竞争,引领未来发展:考取《研发效能(DevOps)工程师职业技术认证》

    突破职场竞争,引领未来发展:考取《研发效能(DevOps)工程师职业技术认证》

    就业形势堪忧,什么最有保障?考个“国家级”证书傍身吧! 工信部教考中心作为中国领先的行业技能认证机构,其颁发的认证证书不仅代表了个人在信息技术领域的专业能力,更可以录入工业和信息化技术技能人才数据库,这是一个重要的信息资源平台,它可以帮助企业和

    2024年02月05日
    浏览(11)
  • [office] Excel中函数进行计算两个日期参数差值的方法 #职场发展#学习方法#媒体

    Excel中函数进行计算两个日期参数差值的方法 在excel使用中,如果想计算两个日期参数的差值,该用什么函数和如何使用呢?今天,小编就教大家在Excel中函数进行计算两个日期参数差值的方法。 Excel中函数进行计算两个日期参数差值的步骤 在excel中计算两个日期参数的差值,

    2024年02月20日
    浏览(11)
  • leetcode做题笔记58

    给你一个字符串  s ,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中  最后一个  单词的长度。 单词  是指仅由字母组成、不包含任何空格字符的最大子字符串。 本题要求最后一个单词长度,只需从后向前遍历,ans不断增加,一旦遇到空格则输出ans的值 本

    2024年02月14日
    浏览(11)
  • leetcode做题笔记59

    给你一个正整数  n  ,生成一个包含  1  到  n2  所有元素,且元素按顺时针顺序螺旋排列的  n x n  正方形矩阵  matrix  。 时间复杂度O(n),空间复杂度O(n^2) 本题要按顺时针顺序排列数组后输出,可设置对应的方向数组,将递增的数通过方向数组放置到正确的位置,最后输

    2024年02月14日
    浏览(10)
  • leetcode做题笔记43

     给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 目录 思路一: 分析: 总结: 时间复杂度O(n*m),空间复杂度O(n) 本题一开始先将两个字符串

    2024年02月15日
    浏览(8)
  • leetcode做题笔记54

    给你一个  m  行  n  列的矩阵  matrix  ,请按照  顺时针螺旋顺序  ,返回矩阵中的所有元素。 时间复杂度O(n^2),空间复杂度O(n) 本题要按顺时针螺旋顺序输出矩阵内的数,可想到利用循环模拟题意作答,设置left,right,up,down来限制输出,使res数组按顺时针顺序存储,最

    2024年02月14日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包