力扣labuladong一刷day17天前缀和数组

news/2024/11/24 0:40:13/

力扣labuladong一刷day17天前缀和数组

一、303. 区域和检索 - 数组不可变

题目链接:https://leetcode.cn/problems/range-sum-query-immutable/
思路:本题即为让写一个类用于计算指定区间内的数字和,但如果直接采用for循环的方式,当有很多的输入实例时,会有很多的重复计算,非常浪费时间。
既然是计算区间和的值,那么我们可以提前准备一个前缀和数组,如nums=[a, b, c, d] 前缀和数组为preSum = [a, a+b, a+b+c, a+b+c+d],这样以后再计算区间和只需要使用前缀合数组preSum[right]-preSum[left]即可,这样就把时间复杂度降低到了常量级。是一个不错的小技巧。

class NumArray {int[] preSum;public NumArray(int[] nums) {this.preSum = new int[nums.length+1];for (int i = 1; i < preSum.length; i++) {preSum[i] = preSum[i-1] + nums[i-1];}}public int sumRange(int left, int right) {return preSum[right+1] - preSum[left];}
}

二、304. 二维区域和检索 - 矩阵不可变

题目链接:https://leetcode.cn/problems/range-sum-query-2d-immutable/
思路:这两道前缀和的题目让我收益匪浅,使用前缀和的数组提前计算数组,把时间复杂度降低到O(1)。要想搞清楚前缀和数组,首先要在使用之前把定义明确,本题求二维区域和,定义前缀和数组为:preSum[i][j]为nums数组从区间[0,0]到[i-1, j-1]。明确定义后写递推公式,和动态规划的dp数组特别像, preSum[i][j] = preSum[i-1][j] + preSum[i][j-1]+matrix[i-1][j-1] - preSum[i-1][j-1];
我感觉本题其实就是动态规划的应用。

class NumMatrix {int[][] preSum;public NumMatrix(int[][] matrix) {int m = matrix.length, n = matrix[0].length;this.preSum = new int[m+1][n+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][col1] - preSum[row2+1][col1] - preSum[row1][col2+1];}
}

http://www.ppmy.cn/news/1238346.html

相关文章

iterator遍历赋值

在Java中&#xff0c;迭代器&#xff08;Iterator&#xff09;是用于遍历集合的对象。它提供了一种顺序访问集合元素的方式&#xff0c;但是不能直接用于给特定索引赋值。 迭代器只能用于遍历集合并访问集合中的元素&#xff0c;而不能通过迭代器来修改集合元素的值。如果你想…

VMware虚拟机安装华为OpenEuler欧拉系统

首先去欧拉官方网站下载openEuler的安装镜像&#xff1a; openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 我下载的是最新的23.03长期维护版本&#xff0c;架构选择x86_64。 创建新虚拟机&#xff1a;选择典型配置&#xff0c;点击下一步&#xff1a;选择下载的镜像文…

acwing算法基础之数学知识--求组合数基础版

目录 1 基础知识2 模板3 工程化 1 基础知识 &#xff08;一&#xff09; 组合数 C n k C_n^k Cnk​的计算公式&#xff0c; C n k n ! k ! ⋅ ( n − k ) ! C_n^k\frac{n!}{k!\cdot (n-k)!} Cnk​k!⋅(n−k)!n!​ 故可以这样计算&#xff0c; int compute_combination_n_k(…

jQuery_01

什么是jQuery&#xff1f; jQuery < 官网 他是一个跨主流浏览器的JavaScript库。一种高级的JavaScript语法库。里面有大量的js函数&#xff0c;使用这些函数操作dom&#xff0c;做事件、动画、ajax处理。语法更加简单了&#xff01;&#xff01;&#xff01; 下载jQu…

vue3自定义拖拽指令

<template><div v-move class"box"></div> </template><script setup lang"ts"> import { Directive } from vue const vMove:Directive (el:HTMLElement) >{const mousedown (e:MouseEvent) >{// 鼠标按下const s…

jenkins + gitlab 自动部署(webhook)

Jenkins是一个流行的开源CI/CD工具&#xff0c;可以与Git等版本控制系统集成&#xff0c;实现自动构建、测试和部署。Webhook是一种机制&#xff0c;可以在Git仓库中设置&#xff0c;在代码提交或合并请求时触发Jenkins构建任务&#xff0c;以完成自动化部署。 实操 设备信息 …

网工内推 | 美的、得力集团,包吃包住,IE认证优先,14薪

01 美的 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责IT网络设备、IDC机房的日常维护巡检、监控和管理&#xff1b; 2.负责路由、交换、防火墙、无线控制器、AP等网络设备的开通、调整、优化升级&#xff1b; 3.负责公司OT、IT网络规划&#xff0c;项目实施以…

搜索引擎语法

演示自定的Google hacking语法&#xff0c;解释含意以及在渗透过程中的作用 Google hacking site&#xff1a;限制搜索范围为某一网站&#xff0c;例如&#xff1a;site:baidu.com &#xff0c;可以搜索baidu.com 的一些子域名。 inurl&#xff1a;限制关键字出现在网址的某…