首页 > 其他分享 >前缀和 & 技巧小记

前缀和 & 技巧小记

时间:2023-06-05 16:36:30浏览次数:45  
标签:技巧 int 矩阵的元 ++ target preSum 小记 前缀




前缀和

  • 子数组的元素之和:一维前缀和
  • 子矩阵的元素之和:二维前缀和
  • 前缀和 + 哈希表:寻找和为 target 的子数组



 


子数组的元素之和:一维前缀和

前缀和适用于快速、频繁地计算一个索引区间内的元素之和。

int res = 0;   // 存储区间[left,right]之和
for (int i = left; i <= right; i++) 
	res += nums[i];
return res;

但放在别的程序,往往需要多次计算区间 [left,right] 之和。

int preSum[nums.length + 1];
for (int i = 1; i < preSum.length; i++) 
	preSum[i] = preSum[i - 1] + nums[i - 1];
	
preSum[right + 1] - preSum[left];       // 每次调用这个即可

比如计算 nums[1,4] 元素和 = preSum[5] - preSum[1].

子矩阵的元素之和:二维前缀和

二维数组的子矩阵的元素之和,也能使用前缀和。

https://leetcode.cn/problems/range-sum-query-2d-immutable/solution/er-wei-qian-zhui-he-jian-dan-tui-dao-tu-sqekv/

任意子矩阵的元素和,都可转成周边4个矩阵的元素和:

前缀和 & 技巧小记_算法

preSum[m + 1][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];   // 目标矩阵之和由四个相邻矩阵运算获得

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];
}

前缀和 + 哈希表:寻找和为 target 的子数组

在 nums 中寻找和为 target 的子数组。

for (int i = 1; i < preSum.length; i++)
    for (int j = 0; j < i; j++) 
        if (preSum[i] - preSum[j] == target)   // 找到了

可以借助哈希表减少一个循环。

int hash[N];
for (int i = 0; i < preSum.length; i++)
	hash[preSum[i]] = i;

for (int i = 1; i < preSum.length; i++) 
    int book = target - preSum[i];
    if ( hash[book] ) // 找到了


标签:技巧,int,矩阵的元,++,target,preSum,小记,前缀
From: https://blog.51cto.com/u_13937572/6417547

相关文章

  • 【JavaScript】setTimeout 和 setInterval 小记
    项目setTimeoutsetInterval名称一次性定时器循环定时器相同在规定延迟时间再执行某个操作在规定延迟时间再执行某个操作区别只能定时一次可以一直循环执行下去......
  • 国考-行测-资料分析速算技巧
    1.资料分析速算技巧2.定义判断重要技巧梳理3.巧辨言语实词4.语句排序题选择技巧5.逻辑填空选择技巧6.间隔增长率的创新变形与预测......
  • 16个好用到爆的Python实用技巧!
    介绍人生苦短,快学Python!Python是一门用途广泛的编程语言,它具有大量的库和框架。有一些鲜为人知的Python编码技巧和库可以让你作为开发人员的工作更为轻松,编写代码更高效。本文将探讨一些鲜为人知的Python技巧,这些技巧非常有用,但并不广为人知。通过学习和使用这些技巧,可以......
  • 专业人士使用的7个秘密TypeScript技巧
    TypeScript是一种出色的工具,可以让我们的生活更轻松并避免错误,但有时使用起来会让人不知所措。 动图 本文概述了所有专业人士都使用的7个TypeScript技巧,它们将使您的生活更轻松。(更多优质教程:java567.com,搜"ts")1.类型推断Typescript足够聪明,可以在您帮助缩小数据类型......
  • 1-3Linux帮助使用小技巧
    获取帮助方法:whatis:使用数据库来显示命令的简短描述此工具在系统刚安装后,不可立即使用,需要制作数据库后才可以使用执行以下命令生成数据库command--helpman/usr/share/doc/RedHatdocumentation、Ubuntudocumentation软件项目网站其它网站搜索 1)如......
  • 类内构造函数前缀explicit
    只有一个参数的构造函数前面加上explicit,这样一来在创建对象时不会被转换类型,因调用构造函数时有explicit限制,如classMyClass{public:explicitMyClass(intvalue):data(value){}intgetData()const{returndata;}private:intdat......
  • C++程序开发技巧
    引言类(class)的使用分为两种——基于对象(objectBased)和面向对象(objectoriented)基于对象是指,程序设计中单一的类,和其他类没有任何关系单一的类又分为:不带指针的类(classwithoutpointermembers)和带指针的类(classwithpointermembers)面向对象则是类(class)中涉及了类之间的关......
  • android布局技巧:创建高效布局
    AndroidUI工具包提供了一些布局管理器,它们使用起来相当容易,而且,大多数的时候,你只需要使用它们最基本的特征来实现UI。执着于基本特征的使用对于创建UI来说,往往不是最高效的。一个常见的例子就是滥用LinearLayout,它将会导致View树中的View数量激增。View——更糟的是,布局管理器——......
  • 如何选择 CMS – 内容管理系统的技巧
    如果您是企业家或开发人员,您很可能会在某个时候使用内容管理系统(CMS)。在为您的用例选择正确的选项时,了解如何分析CMS选项的众多功能非常重要。在本文中,我将解释CMS存在的原因、它们帮助解决的问题,并且我还将提供有用的指导,帮助您根据需要选择合适的CMS。(更多优质教程:jav......
  • 各种语言的宏技巧汇总
    C/C++https://www.cnblogs.com/develon/p/7845880.html日志#include<android/log.h>#defineR(x)#x#defineSTR(x)R(x)#defineLOG(...)__android_log_print(ANDROID_LOG_DEBUG,__FILE_NAME__":"STR(__LINE__),##__VA_ARGS__)#defineTLOG(tag......