算法: 前缀和题目练习

文章目录

  • 前缀和题目练习
    • 前缀和
    • 二维前缀和
    • 寻找数组的中心下标
    • 除自身以外数组的乘积
    • 和为 K 的子数组
    • 和可被 K 整除的子数组
    • 连续数组
    • 矩阵区域和


前缀和题目练习

前缀和

在这里插入图片描述
自己写出来了~

坑:

  • 数据太大,要用long.
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int q = in.nextInt();long[] arr = new long[n];long[] dp = new long[n+1];for(int i=0;i<n;i++) {arr[i] = in.nextLong();dp[i+1] = arr[i] + dp[i];}while(q-- > 0){int l = in.nextInt();int r = in.nextInt();System.out.println(dp[r]-dp[l-1]);}}
}

题解代码:

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int q = in.nextInt();long[] arr = new long[n+1];long[] dp = new long[n+1];for(int i=1;i<=n;i++) {arr[i] = in.nextLong();dp[i] = arr[i] + dp[i-1];}while(q-- > 0){int l = in.nextInt();int r = in.nextInt();System.out.println(dp[r]-dp[l-1]);}}
}

二维前缀和

在这里插入图片描述
自己写出来了~

在往二维数组存数据的时候,内层循环用错了,应该用 m,而不是 n.
在最后计算结果的时候,最开始没有算的太明白.

dp[i][j] 计算的是它左上方所有元素的和(包括自己)~

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int q = in.nextInt();long[][] arr = new long[n+1][m+1];long[][] dp = new long[n+1][m+1];for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {arr[i][j]=in.nextInt();}}for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {dp[i][j] = dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]+arr[i][j];// System.out.printf("%d ",dp[i][j]);}// System.out.println();}while(q-- > 0) {int x1 = in.nextInt();int y1 = in.nextInt();int x2 = in.nextInt();int y2 = in.nextInt();System.out.println(dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]);}}
}

寻找数组的中心下标

在这里插入图片描述
我的第一反应是想用一个sum计算所有元素的和,然后除 2 得到 target,接着再使用滑动窗口寻找这个target , 发现行不通,因为数组中可能有负数和0~

自己写出来了~

坑:

  • 题目说: 如果有结果,返回最靠左的那一个~
class Solution {public int pivotIndex(int[] nums) {int[] dp = new int[nums.length];dp[nums.length - 1] = nums[nums.length - 1];for (int i = nums.length - 2; i >= 0; i--) {dp[i] = dp[i + 1] + nums[i];}int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];if (sum == dp[i])return i;}return -1;}
}

除自身以外数组的乘积

在这里插入图片描述
自己写出来了~
优化前(空间复杂度 O(N) ):

class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] dp1 = new int[n];int[] dp2 = new int[n];int[] ret = new int[n];dp1[0] = nums[0];for (int i = 1; i < n; i++) {dp1[i] = dp1[i - 1] * nums[i];}dp2[n - 1] = nums[n - 1];for (int i = n - 2; i >= 0; i--) {dp2[i] = dp2[i + 1] * nums[i];}ret[0] = dp2[1];ret[n - 1] = dp1[n - 2];for (int i = 1; i < n - 1; i++) {ret[i] = dp1[i - 1] * dp2[i + 1];}return ret;}
}

优化后(空间复杂度 O(1) ):

class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] ret = new int[n];// 计算前面元素的乘积ret[0] = nums[0];for (int i = 1; i < n - 1; i++) {ret[i] = ret[i - 1] * nums[i];}ret[n - 1] = ret[n - 2];// 用sum表示后面元素的乘积int sum = nums[n - 1];for (int i = n - 2; i > 0; i--) {ret[i] = ret[i - 1] * sum;sum *= nums[i];}ret[0] = sum;return ret;}
}

和为 K 的子数组

在这里插入图片描述
因为数组中的元素有小于等于0的数,所以不能使用滑动窗口来解题~

没写出来.

  1. 在 [0 , i - 1] 区间内,有多少个前缀和等于 sum[i] - k
  2. 使用哈希表<前缀和,出现次数>
    在这里插入图片描述
  • 1,2 都懂, 到 3 的时候有点晕.
    class Solution {public int subarraySum(int[] nums, int k) {int n = nums.length;HashMap<Integer, Integer> hash = new HashMap<>();int ret = 0;int sum = 0;hash.put(0, 1);for (int i = 0; i < n; i++) {sum += nums[i];ret += hash.getOrDefault(sum - k, 0);hash.put(sum, hash.getOrDefault(sum, 0) + 1);}return ret;}}

和可被 K 整除的子数组

在这里插入图片描述
没写出来,但是写了个大概,就差一点,
就差 sum = (sum % k + k) % k; 这一句话…

遇到取余就满头包~

每日LeetCode,974. 和可被 K 整除的子数组

写这道题需要知道两个前置知识.

  1. 同余定理
    如果 (a - b) % n == 0 那么我们可以得到一个结论: a % n == b % n.

  2. 修正负数取模的结果
    为了防止出现负数的情况,可以使用 (a % n + n) % n 的形式保证输出结果为正.

    public int subarraysDivByK(int[] nums, int k) {int sum = 0;int ret = 0;int n = nums.length;HashMap<Integer, Integer> hash = new HashMap<>();hash.put(0, 1);for (int i = 0; i < n; i++) {sum += nums[i];sum = (sum % k + k) % k;ret += hash.getOrDefault(sum, 0);hash.put(sum, hash.getOrDefault(sum, 0) + 1);}return ret;}

连续数组

在这里插入图片描述
这一次 HashMap 中存的就不是数字出现的次数了,而是数字出现的下标.

class Solution {public int findMaxLength(int[] nums) {int ret = 0;int n = nums.length;HashMap<Integer,Integer> hash = new HashMap<>();int sum = 0;hash.put(0,-1);for(int i=0;i<n;i++) {sum += nums[i] == 0?-1:1;if(hash.containsKey(sum)) {ret = Math.max(ret,i - hash.get(sum));}else {// 当不包含 sum 时,放进hash中// 当 hash 中已经包含 sum 时,不必再放入// ret = i - hash.get(sum)// 我们要求的是最大值,因此hash.get(sum)越小越好,// 而新 put 进来的下标i 一定没有 之前的下标小// 也就是说新的hash.get(sum)比旧的hash.get(sum)大 // 用一句话概括:// 当 hash 中已经包含 sum 时,此时再更新i的话 ret 会变小// 因此要写 elsehash.put(sum,i);}}return ret;}
}

矩阵区域和

在这里插入图片描述
坑;

  • 范围容易找错
    在这里插入图片描述

  • 如果善用 Math 方法更好一点~

class Solution {public int[][] matrixBlockSum(int[][] mat, int k) {int m = mat.length;int n = mat[0].length;int[][] ret = new int[m][n];int[][] dp = new int[m+1][n+1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = mat[i-1][j-1] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int a = Math.min(i+k+1,m);int b = Math.min(j+k+1,n);int c = Math.max(i-k+1,1);int d = Math.max(j-k+1,1);ret[i][j] = dp[c-1][d-1] - dp[c-1][b] - dp[a][d-1] + dp[a][b];}}return ret;}
}

本文到这里就结束啦~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444247.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;CoT思维链概述&#x1f4af;CoT思维链在大型语言模型中的应用&#x1f4af;CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 &#x1f4a…

网关在不同行业自动化生产线的应用

网关在不同行业自动化生产线的应用&#xff0c;展示了其作为信息与物理世界交汇点的广泛影响力&#xff0c;尤其在推动行业智能化、自动化方面发挥了不可估量的作用。以下是网关技术在污水处理、智慧农业、智慧工厂、电力改造及自动化控制等领域的深入应用剖析。 1. 污水处理 …

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图&#xff1a;1.1.2、 LSW11.1.3、 LSW2 1.2、…

智谱开放平台API调用解析

一、什么是智谱AI 智谱AI成立于2019年&#xff0c;由‌清华大学计算机系知识工程实验室的技术成果转化而来&#xff0c;是一家致力于人工智能技术研发和应用的公司。智谱致力于打造新一代认知智能大模型&#xff0c;专注于做大模型的中国创新。 二、智谱开放平台API调用 官方文…

十、kotlin的协程

协程 基本概念定义组成挂起和恢复结构化并发协程构建器作用域构建器挂起函数阻塞与非阻塞runBlocking全局协程像守护线程 Job的生命周期 常用函数延时和等待启动和取消启动取消 暂停 协程启动调度器启动方式启动模式线程上下文继承的定义继承的公式 协程取消与超时取消挂起点取…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

电磁兼容系列

1.1 电磁兼容基本概念 “电磁兼容是研究在有限空间、时间、频谱资源条件下&#xff0c;各种用电设备&#xff08;广义的还包括生物体&#xff09;可以共存&#xff0c;并不致引起降级的一门学科。“ 研究频率范围&#xff1a;0Hz~400GHz&#xff08;CISRP 24&#xff09;&…

vite学习教程05、vite+vue2构建本地 SVG 图标

文章目录 前言一、构建本地SVG图标详细步骤1、安装开发依赖2、配置vite2.1、配置vite.config.js2.2、封装vite引入插件脚本 解决报错&#xff1a;can not find package fast-glob imported 二、实际应用应用1&#xff1a;未封装&#xff0c;直接vue应用应用2&#xff1a;封装vu…

RTSP 音视频play同步分析

基础理论 RTSP RTP RTCP SDP基础知识-CSDN博客 关于RTP的时间戳知识点回顾 时间戳单位&#xff1a;时间戳计算的单位不是秒&#xff0c;而是采用采样频率的倒数&#xff0c;这样做的目的是为了使时间戳单位更为精准。比如说一个音频的采样频率为8000Hz&#xff0c;那么我们可…

J1学习打卡

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 # 数据预处理和加载 import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, …

5.C语言基础入门:数据类型、变量声明与创建详解

C语言基础入门&#xff1a;数据类型、变量声明与创建详解 C语言往期系列文章目录 往期回顾&#xff1a; C语言是什么&#xff1f;编程界的‘常青树’&#xff0c;它的辉煌你不可不知VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】&#xff0c;3.4k stars - WiFi 网络分析工具二、【penpot】&#xff0c;33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】&#xff0c;6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …

leetcode hot100_part3_滑动窗口

滑动窗口是有一个基本的模版的&#xff0c;不要自己想当然哦~ 滑动窗口算法思想&#xff08;附经典例题&#xff09;_滑动窗口的思想-CSDN博客 滑动窗口也叫同向双指针&#xff1b;可以先看一下灵山视频&#xff1a;滑动窗口【基础算法精讲 03】_哔哩哔哩_bilibili 3.无重复字…

7.C++面向对象3(拷贝构造函数,赋值运算符重载)

⭐本篇为C学习第7章&#xff0c;主要了解 拷贝构造函数&#xff0c;赋值运算符重载 ⭐本人Gitee C代码仓库&#xff1a;yzc的c学习: 小川c的学习记录 - Gitee.com 上篇讲了6个默认成员函数的构造函数和析构函数。 重要代码如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS…

Mysql(五) --- 数据库设计

文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…

Pr:视频效果快速参考(合集 · 2024版)

Premiere Pro 自带十七组约一百多个视频效果&#xff0c;涵盖了从变换、颜色控制到风格化等多种用途&#xff0c;帮助用户在视频编辑中实现多样化的视觉表现、进行后期处理以及修正各种画质问题。 提示&#xff1a; 点击下面的效果组名称或截图&#xff0c;即可访问该组里面的效…

SF6气体密度监测仪市场研究:主要企业的市场份额已超过37.13%

SF6气体密度监测仪是一种专用于监测和测量六氟化硫&#xff08;SF6&#xff09;气体密度的设备。SF6气体因其优异的绝缘性能和灭弧能力&#xff0c;被广泛应用于电力行业&#xff0c;尤其是在气体绝缘金属封闭开关设备&#xff08;GIS&#xff09;和断路器等关键设备中。随着电…

【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;序列到序列&#xff08;seq2seq&#xff09;模型和Transformer架构的出现&#xff0c;极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络&#xff08;RNN&…

微服务Sleuth解析部署使用全流程

目录 1、Sleuth链路追踪 1、添加依赖 2、修改日志配置文件 3、测试 2、zipkin可视化界面 1、docker安装 2、添加依赖 3、修改配置文件 4、查看页面 5、ribbon配置 1、Sleuth链路追踪 sleuth是链路追踪框架&#xff0c;用于在微服务架构下开发&#xff0c;各个微服务之…