小而美的算法技巧:前缀和数组

2024-06-14 00:28

本文主要是介绍小而美的算法技巧:前缀和数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小而美的算法技巧:前缀和数组

类似动态规划。

class NumArray {private int[] preSum;public NumArray(int[] nums) {preSum=new int[nums.length+1];//preSum[0]的前缀和为0for(int i=1;i<preSum.length;i++){preSum[i]=nums[i-1]+preSum[i-1];//先计算累加和}}public int sumRange(int left, int right) {return preSum[right+1]-preSum[left];}
}

 前缀和矩阵的构建

我们用 preSum[i][j] 表示从矩阵的左上角 (0,0) 到位置 (i-1,j-1) 这个子矩阵的元素和。为了计算这个值,我们需要考虑以下几个部分的贡献:

  1. 上方的区域
  • 这是从矩阵的左上角 (0,0) 到位置 (i-2,j-1) 这个子矩阵的元素和,表示为 preSum[i-1][j]
  1. 左侧的区域
  • 这是从矩阵的左上角 (0,0) 到位置 (i-1,j-2) 这个子矩阵的元素和,表示为 preSum[i][j-1]
  1. 当前位置的元素
  • 这是当前矩阵位置的元素值,表示为 matrix[i-1][j-1]
  1. 重复计算的区域
  • 上述两个部分(上方和左侧)的交集部分,即从矩阵的左上角 (0,0) 到位置 (i-2,j-2) 这个子矩阵的元素和,被重复计算了一次,所以需要减去,表示为 preSum[i-1][j-1]

因此,结合上述四个部分的计算,我们得到:

preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] + matrix[i - 1][j - 1] - preSum[i - 1][j - 1];

class NumMatrix {private int[][] preSum;public NumMatrix(int[][] matrix) {int m=matrix.length,n=matrix[0].length;//行列preSum=new int[m+1][n+1];//记录到i-1 j-1的值for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){preSum[i][j]=preSum[i-1][j]+preSum[i][j-1]+matrix[i-1][j-1]-preSum[i-1][j-1];}}}public int sumRegion(int row1, int col1, int row2, int col2) {return preSum[row2+1][col2+1]-preSum[row1][col2+1]-preSum[row2+1][col1]+preSum[row1][col1];}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减

小而美的算法技巧:差分数组

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减

 

class Solution {public int[] corpFlightBookings(int[][] bookings, int n) {int[] nums=new int[n];//差分方法,只用操作两次for(int[] booking:bookings){nums[booking[0]-1]+=booking[2];//索引从0开始所以-1if(booking[1]<n){nums[booking[1]]-=booking[2];}}for(int i=1;i<n;i++){nums[i]+=nums[i-1];}return nums;}
}

From和to是区间,

class Solution {public boolean carPooling(int[][] trips, int capacity) {int[] dif=new int[1001];for(int[] trip:trips){dif[trip[1]]+=trip[0];dif[trip[2]]-=trip[0];}int cur=0;for(int i=0;i<dif.length;i++){cur+=dif[i];if(cur>capacity) return false;}return true;}
}

这篇关于小而美的算法技巧:前缀和数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058851

相关文章

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n