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

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

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第