码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 前缀和数组系列


    涉及三道题:
    303. 区域和检索 - 数组不可变
    304. 二维区域和检索 - 矩阵不可变
    560. 和为 K 的子数组

    如果要得到「区间和」,能想到最简单的方法就是遍历所求区间,循环相加即可。如果这种需求有很多,此时,时间复杂度为 O(n^2)
    基于上面描述的场景,我们完全可以使用「前缀和」优化,前缀和数组中每个元素的值为区间[0…i]的元素和。

    注意:
    前缀和适用于不变数组;对于变化的数组,可以使用「线段树」,关于线段树的详细介绍可见 线段树详解
    区域和检索 - 数组不可变

    区域和检索 - 数组不可变

    题目详情可见 :区域和检索 - 数组不可变

    建议:preSum[]整体向后偏移一位,简便处理
    在这里插入图片描述

    如果求区间[2,4]的和,只需计算preSum[4 + 1] - preSum[2]即可

    代码:

    class NumArray {
        // 记录前缀和的数组
        private int[] preSum;
        public NumArray(int[] nums) {
            // preSum 从 1 开始,避免越界问题
            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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    题目详情可见 :二维区域和检索 - 矩阵不可变
    在这里插入图片描述

    如果求红色区间的和,只需求preSum[4,4] - preSum[1,4] - preSum[4,1] + preSum[1,1]即可
    ● preSum[4,4]:黄 + 蓝 + 绿 + 红
    ● preSum[1,4]:黄 + 蓝
    ● preSum[4,1]:黄 + 绿
    ● preSum[1,1]:黄

    代码:

    class NumMatrix {
        private int[][] preSum;
        public NumMatrix(int[][] matrix) {
            int m = matrix.length;
            int n = matrix[0].length;
            preSum = new int[m + 1][n + 1];
            for (int i = 1; i < m + 1; i++) {
                for (int j = 1; j < n + 1; j++) {
                    preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + matrix[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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    和为 K 的子数组

    题目详情可见 和为 K 的子数组
    借鉴「两数和」的思路,利用HashMap。

    代码:

    public int subarraySum(int[] nums, int k) {
    
        Map<Integer, Integer> preSum = new HashMap<>();
        preSum.put(0, 1);
    
        int sum = 0;
        int res = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            int target = sum - k;
            if (preSum.containsKey(target)) res += preSum.get(target);
            preSum.put(sum, preSum.getOrDefault(sum, 0) + 1);
        }
        return res;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    改进YOLOv7系列:22.最新HorNet结合YOLOv7应用! | 多种搭配,即插即用 | Backbone主干、递归门控卷积的高效高阶空间交互
    ipad触控笔是哪几款?开学季便宜的ipad电容笔推荐
    006. 分割回文串
    鸿蒙4.0开发笔记之DevEco Studio如何使用Previewer窗口预览器(一)
    基于web的酒店客房管理系统
    中科院自动化所:基于关系图深度强化学习的机器人多目标包围问题新算法
    荐书丨《哥德尔、艾舍尔、巴赫书:集异璧之大成》:机器人与音乐的次元壁破了
    pandas使用isin函数和any函数筛选dataframe数据中所有数据列中至少有一列包含指定数值的数据行(in any of the columns)
    使用C语言EasyX 创建动态爱心背景
    ADRC自抗扰控制
  • 原文地址:https://blog.csdn.net/m0_58058653/article/details/125629756
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号