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

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

相关文章

【EverEdit】活用 EverEdit 小技巧

【EverEdit】活用 EverEdit 小技巧 (1)设置 EverEdit 对比文件文本内容 设置如下图所示: 首先要先打开要对比的文本文件,和对比文件相比,此时打开了至少两个文件: 选择文件比较: (2)如何设置 EverEdit 监视文件的变化 设置如下图所示:

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

邮件群发推送的方法技巧?有哪些注意事项?

邮件群发推送的策略如何实现?邮件推送怎么评估效果? 电子邮件营销是现代企业进行推广和沟通的重要工具。有效的邮件群发推送不仅能提高客户参与度,还能促进销售增长。AokSend将探讨一些关键的邮件群发推送方法和技巧,以帮助企业优化其邮件营销策略。 邮件群发推送:目标受众 了解他们的需求、兴趣和行为习惯有助于你设计出更具吸引力和相关性的邮件内容。通过收集和分析数据,创建详细的客户画像,可以更精

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

Java中的正则表达式使用技巧

Java中的正则表达式使用技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们来探讨一下Java中正则表达式的使用技巧。正则表达式是一种强大的工具,用于字符串匹配、替换和分割等操作。掌握正则表达式能够大大提高我们处理文本数据的效率。 1. 正则表达式的基本概念 正则表达式(Regular Expression,简称

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

【Java算法】滑动窗口 下

​ ​    🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🦌一.水果成篮 题目链接:904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”(Sliding Window)策略,结合哈希表(Map)来高效地统计窗口内不同水果的种类数量。以下是详细分析: 初始化:创建一个空的哈希表 map 用来存储每种水果的数量,初始化左右指针 left

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt