【算法】——前缀和(矩阵区域和详解,文末附)

news2024/12/26 21:08:37

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:前缀和模版

二:前缀和模版2

三:寻找数组的中心下标

四:除自身以外数组的乘积

五:和为K的子数组

六:和被k整除的子数组

七:连续数组

八:矩阵区域和


一:前缀和模版

【模板】前缀和_牛客题霸_牛客网

b914124319454b7ca4f99b6dc0c952f4.png

977893da51604d548eb7b243edc840b5.png

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //1:获取输入
        int n = in.nextInt() , q = in.nextInt();//长度为n的数组,q次查询
        int[] arr = new int[n+1];
        for(int i = 1 ; i <= n ; i++){
            arr[i] = in.nextInt();
        }

        //2:创建dp数组
        long[] dp = new long[n+1]; 
        for(int i = 1 ; i <= n ; i++){
            dp[i] = dp[i-1] + arr[i];
        }

        while(q > 0){
            int l = in.nextInt() , r = in.nextInt();
            System.out.println(dp[r]-dp[l-1]);
            q--;
        }

         
    }
}

二:前缀和模版2

【模板】二维前缀和_牛客题霸_牛客网

ce685505e13641b9a5af94a52da7ce31.png

6685e5b082cd46c78de89621beeff27e.png7e26e020566b4c1987b63f2e779413b8.png

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
       int n = in.nextInt() , m = in.nextInt() , q = in.nextInt();
        
        //arr数组
       long[][] arr = 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();
        }
       }

       //copy创建一个dp数组

       long[][] dp = new long[n+1][m+1];
       for(int i = 1 ; i <= n ; i++){
        for(int j = 1 ; j <= m ; j++){
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + arr[i][j];
        }
       }

       while(q > 0){
        int x1 = in.nextInt() , y1 = in.nextInt() , x2 = in.nextInt() , y2 = in.nextInt();
        long result = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1];
        System.out.println(result);
        q--;
       }
    }
}

三:寻找数组的中心下标

724. 寻找数组的中心下标 - 力扣(LeetCode)

a2b1281a187c47839f11011c1caae29e.png

07e3e13887b6467aac8368899b5d459f.png

class Solution {
    public int pivotIndex(int[] nums) {
        int n = nums.length;
        //前缀和数组
        int[] f = new int[n];
        f[0] = 0;
        for(int i = 1 ; i < n ; i++){
            f[i] = f[i-1] + nums[i-1];
        }   
        //后缀和数组
        int[] g = new int[n];
        g[n-1] = 0;
        for(int i = n-2 ; i >= 0 ; i--){
            g[i] = g[i+1] + nums[i+1];
        }
        int result = Integer.MAX_VALUE;
        for(int i = 0 ; i < n ; i++){
            if(f[i] == g[i]){
                result = Math.min(result,i);
            }
        }
        if(result == Integer.MAX_VALUE){
            return -1;
        }else{
            return result;
        }

    }
}

四:除自身以外数组的乘积

 238. 除自身以外数组的乘积 - 力扣(LeetCode)

bdda15ff74b34fff91fcd8d90a17cfd5.png

db506c245977493086f07b34918b5d0a.png

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;

        //前缀积
        int[] f = new int[n];
        f[0] = 1;
        for(int i=1 ; i<n ; i++ ){
            f[i] = f[i-1]*nums[i-1];
        }

        int[] g = new int[n];
        g[n-1] = 1;
        for(int i=n-2 ; i >= 0 ; i--){
            g[i] = g[i+1]*nums[i+1];
        }

        int[] answer = new int[n];
        for(int i = 0 ; i < n ; i++){
            answer[i] = f[i]*g[i];
        }
        return answer;
    }
}

五:和为K的子数组

560. 和为 K 的子数组 - 力扣(LeetCode)

38175f82cfe64fff9f2291e41eeaf002.png

017422b8821741c58740095385ffc998.png

class Solution {
    public int subarraySum(int[] nums, int k) {
        Map<Integer,Integer> hash = new HashMap<>();
        hash.put(0,1);
        int sum = 0 , ret = 0;
        for(int x : nums){
            sum += x;
            ret += hash.getOrDefault(sum-k,0);
            hash.put(sum,hash.getOrDefault(sum,0)+1);
        }
        return ret;
        
    }
}

六:和被k整除的子数组

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

30627592fb08429eae6103ba396a24e6.png

26f49dea7d584e1cbb3d435127c9b5b9.png

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        Map<Integer,Integer> hashMap = new HashMap<Integer,Integer>(); 
        hashMap.put(0 % k , 1);//默认有一个前缀和=0

        int sum = 0;//前缀和
        int ret = 0;//用来计数
        for(int x : nums){
            sum += x;
            int remainder = (sum % k + k) % k;
            ret += hashMap.getOrDefault(remainder,0);
            hashMap.put(remainder,hashMap.getOrDefault(remainder,0)+1);
        }

        
        return ret;
    }
}

七:连续数组

525. 连续数组 - 力扣(LeetCode)

014ac6f7fa7d44638292a0fb21655d5f.png

5e00354c1cbb4ecdbfd3039fdcac0042.png

class Solution {
    public int findMaxLength(int[] nums) {
        
        for(int i = 0 ; i < nums.length ; i++){
            if(nums[i] == 0){
                nums[i] = -1;
            }
        }
        Map<Integer,Integer> hash = new HashMap<>();
        hash.put(0,-1);
        int sum = 0 , ret = 0;
        for(int i = 0 ; i < nums.length ; i++){
            sum += nums[i];
            if(hash.containsKey(sum)){
                int old = hash.get(sum);
                int tem = i-old;
                ret = Math.max(ret,tem);
            }else{
                hash.put(sum,i);
            }

        }
        return ret;
    }
}

八:矩阵区域和

1314. 矩阵区域和 - 力扣(LeetCode)

05557cde976341f99341f10b4a1a4eaa.png

c81ae256e1174ff8b0f53146f9fcf2dd.png

1788f6853651489d8c593028e6e1011e.png

class Solution {
    public int[][] matrixBlockSum(int[][] mat, int k) {
        int m = mat.length , n = mat[0].length;

        //1:初始化dp前缀和数组
        int[][] dp = new int[m+1][n+1];
        for(int i = 1 ; i < m+1 ; i++){
            for(int j = 1 ; j < n+1 ; j++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1] + mat[i-1][j-1];
            }
        }

        //2:处理前缀和数组
        int[][] ret = new int[m][n];
        for(int i = 0 ; i < m ; i++){
            for(int j = 0 ; j < n ; j++){
                int x1 = Math.max(0,i-k)+1 , y1 = Math.max(0,j-k)+1;
                int x2 = Math.min(i+k,m-1)+1 , y2 = Math.min(j+k,n-1)+1;
                ret[i][j] = dp[x2][y2] - dp[x2][y1-1] -dp[x1-1][y2] + dp[x1-1][y1-1];
            }
        }
        return ret;
    



    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kotlin 】内联类(value class / inline class)

官方文档&#xff1a;https://kotlinlang.org/docs/inline-classes.html 注&#xff1a;inline class 关键字已经被废弃&#xff0c;取而代之的是value class。现在使用内联类需要定义类为value class&#xff0c;并使用JvmInline注解进行标注。 一、使用场景 有时候&#xff…

【热门主题】000076 探索单片机的奥秘:原理、编程与应用全解析

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

泷羽sec学习打卡-shell命令9

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell完结 方法一方法二重定向示例1示例2示例3 文件描述符例1例2 实践是检验真理的…

【Java】Scanner类的使用

Scanner类&#xff1a;从输入源&#xff08;键盘&#xff09;读取数据&#xff08;Java自己已经写好的一个类&#xff09; 使用&#xff1a; 1.导入Scanner类&#xff1a;import java.util.Scanner;&#xff08;为使用Scanner类做准备&#xff09; 2.创建Scanner类的对象&am…

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/04

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…

Mac安装MINIO服务器实现本地上传和下载服务

0.MINIO学习文档 Minio客户端mc使用 | Elibaron学习笔记 1.Mac安装MINIO 中文官方网址&#xff1a;MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 (1) brew 安装 brew install minio/stable/minio &#xff08;2&#xff09;安装完成&#xff0c;执行brew i…

2024-12-03OpenCV图片处理基础

OpenCV图片处理基础 OpenCV的视频教学&#xff1a;https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV摄像头读取 OpenCV使用摄像头读取图片帧&#xff0c;点击S保存当前帧到指定文件夹&#xff0c;点击Q关闭窗口&#xff0c;点击其他按钮打印按钮的值 要实现这个功能&…

nginx中tcp_nodelay、types_hash_max_size都是什么配置?

nginx中tcp_nodelay、types_hash_max_size都是什么配置&#xff1f; 在 Nginx 中&#xff0c;tcp_nodelay 和 types_hash_max_size 是两个不同的配置项&#xff0c;它们分别与网络性能优化和 MIME 类型的管理相关。 1. tcp_nodelay 功能&#xff1a; 控制是否启用 TCP_NODELAY…

openGauss开源数据库实战十九

文章目录 任务十九 openGauss DML 语句测试任务目标实施步骤一、准备工作二、INSERT语句三、DELETE语句四、UPDATE语句五、清理工作 任务十九 openGauss DML 语句测试 任务目标 掌握DML语句的用法,包括INSERT语句、DELETE语句和UPDATE语句。 实施步骤 一、准备工作 使用Li…

400G智算网络助力知名自动驾驶企业算力训练提效

根据Gartner的最新趋势预测&#xff0c;自动驾驶技术正迅速发展&#xff0c;预计在未来几年内将带来显著的商业效益&#xff0c;特别是在决策智能和边缘人工智能领域。目前&#xff0c;一家领军企业正积极拥抱基于大模型的数字化转型之路&#xff0c;作为自动驾驶领域的佼佼者&…

openEuler 知:安装 GNOME 桌面

openEuler 标准版 ISO 镜像默认不带桌面安装方式&#xff0c;可以先用最小化方式安装系统&#xff0c;然后单独安装 GNOME 组来实现桌面化 dnf group install GNOME -y安装完后&#xff0c;将 systemd 默认 target 设置为 graphical.target systemctl set-default graphical.…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…

多行为推荐-KBS 24|基于HyperGRU对比网络的短视频推荐多行为序列建模

论文&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0950705124004751?via%3Dihub 关键词&#xff1a;短视频推荐&#xff0c;多行为推荐&#xff0c;对比学习&#xff0c;RNN 1 动机 这是我第一次看短视频推荐里涉及到多行为的论文&#xff0c;动机还…

企业网双核心交换机实现冗余和负载均衡(MSTP+VRRP)

MSTP&#xff08;多生成树协议&#xff09; 通过创建多个VLAN实例&#xff0c;将原有的STP、RSTP升级&#xff0c;避免单一VLAN阻塞后导致带宽的浪费&#xff0c;通过将VLAN数据与实例绑定&#xff0c;有效提升网络速率。 VRRP&#xff08;虚拟路由冗余协议&#xff09; 用…

图解RabbitMQ七种工作模式生产者消费者模型的补充

文章目录 1.消费者模型2.生产者-消费者模型注意事项2.1资源释放顺序问题2.2消费者的声明问题2.3虚拟机和用户的权限问题 3.七种工作模式3.1简单模式3.2工作模式3.3发布/订阅模式3.4路由模式3.5通配符模式3.6RPC通信3.7发布确认 1.消费者模型 之前学习的这个消息队列的快速上手…

制造业管理系统中ERP与MES的区别

在当今工业4.0的背景下&#xff0c;数字化管理已成为现代工厂不可或缺的一部分。在这一进程中&#xff0c;企业资源计划&#xff08;ERP&#xff09;系统和制造执行系统&#xff08;MES&#xff09;扮演着关键角色。尽管如此&#xff0c;许多工厂的管理者对于ERP和MES的理解仍存…

面向初学者的 Ansys Mechanical 中的接触建模

接触概述 Ansys Mechanical 中的接触建模是仿真结构不同部分在各种条件下如何相互作用的关键方面。它涉及定义表面的接触方式&#xff0c;即它们是接触、滑动还是分离。Ansys Mechanical 提供了广泛的接触选项来准确建模这些交互&#xff0c;包括粘合、摩擦和无分离接触。每个…

【C++指南】C++内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 一、C 内存管理概述 二、C内存区域划分 三、C 内存管理方式 &#x1f343;1.自动内存管理…

聚类算法全面解析:理论与实践结合

聚类&#xff08;Clustering&#xff09;是数据挖掘和机器学习中一类重要的无监督学习方法&#xff0c;旨在将数据划分为多个类别&#xff0c;使得类别内部的数据相似度高&#xff0c;而类别之间的数据差异较大。聚类广泛应用于图像分割、市场分析、生物信息学、文本挖掘等领域…