leetcode刷题 | 关于前缀和题型总结1

news2024/11/27 10:25:30

leetcode刷题 | 关于前缀和题型总结1

文章目录

  • leetcode刷题 | 关于前缀和题型总结1
    • 题目链接
    • 和为K的子数组
    • 连续数组/0 和 1 个数相同的子数组
    • 和大于等于 target 的最短子数组/长度最小的子数组
    • 路经总和Ⅲ

题目链接

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

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

209. 长度最小的子数组 - 力扣(LeetCode)

437. 路径总和 III - 力扣(LeetCode)

和为K的子数组

前缀和:默认下标可以从1开始

前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和
在这里插入图片描述

class Solution {
    public int subarraySum(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        int[] sums = new int[nums.length+1];
        for(int i = 1;i<nums.length+1;i++){
            sums[i] = sums[i-1]+nums[i-1];
        }
        int res = 0;
        for(int i = 1;i<sums.length;i++){
            int target = sums[i]-k;
            res += map.getOrDefault(target,0);
            map.put(sums[i],map.getOrDefault(sums[i],0)+1);
        }
        return res;
    }
}

可以先计算出每一个元素的前缀和,本题求解的是和为k的子数组,也就是从下标[j,i]元素的和为k,这条件可以表示为sums[i]-sums[j-1] == k,,那么进行变换可以得到sums[i]-k == sums[j-1],就可以转换为前缀和sums数组中有多少个值等于sum[i]-k

map保存的是以前缀和为键,出现的次数为值,通过从map中获取到sums[j-1]的个数

每一次循环都要将得到的前缀和存入到map中,以便下一次计算

之后的每一道题的思想都类似于本题

连续数组/0 和 1 个数相同的子数组

class Solution {
    public int findMaxLength(int[] nums) {
        int res = 0;
        int[] sums = new int[nums.length+1];
        for(int i = 1;i<sums.length;i++){
            sums[i] = sums[i-1]+(nums[i-1] == 0? -1 : 1);
        }
        Map<Integer,Integer> map = new HashMap();
        map.put(0,0);
        for(int i = 1;i<sums.length;i++){
            if(map.containsKey(sums[i])) res = Math.max(res,i-map.get(sums[i]));
            else map.put(sums[i],i);
        }
        return res;
    }
}

和大于等于 target 的最短子数组/长度最小的子数组

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int start = 0;
        int sum = 0;
        int res = Integer.MAX_VALUE;
        for(int i= 0; i< nums.length;i++){
            sum+=nums[i];
            while(sum >= target){
                res = Math.min(res,i-start+1);
                sum -= nums[start];
                start ++;
            }
            
        }
        return res == Integer.MAX_VALUE?0: res;
    }
}

路经总和Ⅲ

前缀和解法

class Solution {
    public int pathSum(TreeNode root, long targetSum) {
        Map<Long, Integer> prefix = new HashMap<Long, Integer>();
        prefix.put(0L, 1);
        return dfs(root, prefix, 0, targetSum);
    }
    public int dfs(TreeNode root,Map<Long,Integer> prefix,long cur,long target){
        if (root == null) return 0;
        int res = 0;
        cur += root.val; //当前节点的前缀和
        res = prefix.getOrDefault(cur-target,0);
        prefix.put(cur,prefix.getOrDefault(cur,0)+1);
        res += dfs(root.left,prefix,cur,target);
        res += dfs(root.right,prefix,cur,target);
        //回溯
        prefix.put(cur,prefix.getOrDefault(cur,0)-1);
        return res;
    }
}

递归解法

class Solution {
   public int pathSum(TreeNode root, long targetSum) {
        if(root == null) return 0;
        int count = nodeSum(root, targetSum);
       // 每一个节点都作为根节点进行递归
        return count + pathSum(root.left, targetSum) + pathSum(root.right, targetSum);
    }
    private int nodeSum(TreeNode node, long targetSum){
        if(node == null) return 0;
        int count = 0;
        long val = node.val;
        if(val == targetSum) count++;
        return count + nodeSum(node.left, targetSum - val) + nodeSum(node.right, targetSum - val);
    }
}

targetSum) count++;
return count + nodeSum(node.left, targetSum - val) + nodeSum(node.right, targetSum - val);
}
}


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

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

相关文章

Python-第三天 Python判断语句

Python-第三天 Python判断语句一、 布尔类型和比较运算符1.布尔类型2.比较运算符二、if语句的基本格式1.if 判断语句语法2.案例三、 if else 语句1.语法2.案例四 if elif else语句1.语法五、判断语句的嵌套1.语法六、实战案例一、 布尔类型和比较运算符 1.布尔类型 布尔&…

【学习笔记】Nginx实战

反向代理实战 解压Tomcat两次-Tomcat8081、Tomcat8082两个文件夹Tomcat8081只需要修改http协议端口8081Tomcat8082&#xff1a;&#xff08;三个都需要改&#xff0c;不然只会启动其中一个&#xff09;1.修改server的默认端口2.修改http协议的默认端口3.膝盖默认ajp协议的默认端…

面试题: Redis的数据备份

1 RDBRDB全称为Redis Database Backup file &#xff0c;也被叫做Redis数据快照&#xff0c;简单来说就是将当前的所有数据都记录打哦磁盘中&#xff0c;当redis故障重启时&#xff0c;从磁盘读取快照文件进行数据恢复。连接客户端后&#xff0c;使用save命令进保存&#xff0c…

设置Visual Studio 2022背景图

前言 编写代码时界面舒服&#xff0c;自己喜欢很重要。本篇文章将会介绍VS2022壁纸的一些设置&#xff0c;主题的更改以及如何设计界面。 理想的界面应该是这样的 接下来我们来一步步学习如何将界面设计成这样 一、壁纸插件下载 1.拓展->点击拓展管理 2.右上角搜索backgro…

【shell 编程大全】shell 变量的定义以及使用

shell 变量定义 以及使用从此刻开始跟我一起学习shell 相关知识吧 前情回顾 上一章节【shell 前奏知识】 我们已经学习了很多shell的必备知识&#xff0c;让我们一起来回顾下。 shelll的存放位置如何切换shellshell文件中的注释有哪些查看当前系统的shell类型执行shell的n种方…

ubuntu20.04如何安装nvidia-docker?

文章目录安装步骤导入 NVIDIA GPG 密钥添加 NVIDIA Docker 存储库安装 nvidia-container-toolkit检查nvidia-docker是否安装成功安装步骤 导入 NVIDIA GPG 密钥 curl -s https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -添加 NVIDIA Docker 存储库 dist…

2010-2019年290个地级市经济发展与城市绿化数据

2010-2019年290个地级市经济发展与城市绿化数据 1、时间&#xff1a;2010-2019年 2、来源&#xff1a;城市统计NJ&#xff0c;缺失情况与NJ一致 3、范围&#xff1a;290个地级市 4、指标&#xff1a; 综合经济&#xff1a;地区生产总值、人均地区生产总值、地区生产总值增…

开源的电子邮件客户端Cypht

网友 OOXX 在找好用的 webmail&#xff0c;老苏觉得 Cypht 还不错 什么是 Cypht &#xff1f; Cypht 是一个简单、轻量级和现代的 Webmail 客户端&#xff0c;它将多个帐户聚合到一个界面中。除了电子邮件帐户&#xff0c;它还支持 Atom/RSS 源。 安装 建数据库 数据库直接用…

MySQL数据库03——数据表的创建、修改和删除

接着上一章的内容&#xff0c;第一章安装好了Mysql和对应的编译器workbench&#xff0c;并且简单的创造了一个数据库college&#xff0c;第二章了解了SQL基础的动词和数据类型。这一章我们学习怎么用这些动词&#xff0c;在这个college库里面创建数据表&#xff0c;并且修改删除…

学习周报-2023-0210

文章目录一 在SUSE11sp3系统中将openssh从6升级到8一 需求二 系统环境三 部署流程1.上传编译安装的软件包2.安装 gcc编译软件3.安装依赖zlib4.安装依赖openssl5.安装openssh二 在CentOS-6.9配置apache服务&#xff08;3&#xff09;---虚拟主机配置一 定义二 系统环境三 基于域…

浅解ThreadLocal

我们知道的是synchronized能够解决线程安全中的内存可见性问题&#xff08;让每个线程读取到的变量一致&#xff09;&#xff0c;而ThreadLocal恰好相反&#xff0c;它是让每个线程都有处理任务过程中不同的值。而我们通过代码发现他确实可以实现这样的功能package executor;/*…

chatgpt注册问题解决. You‘ve made too many phone verification requests.

本来想多注册chagpt几个号&#xff0c;发现注册不了了 错误&#xff1a;You’ve made too many phone verification requests. Please try again later or contact us through our help center at help.openai.com. 或者错误&#xff1a;We’ve detected suspicious behavior…

Java数据结构中二叉树的深度解析及常见OJ题

本篇文章讲述Java数据结构中关于二叉树相关知识及常见的二叉树OJ题做法讲解&#xff08;包含非递归遍历二叉树&#xff09; 目录 一、二叉树 1.1二叉树概念 1.2特殊的二叉树 1.3二叉树性质 1.4二叉树基本性质定理题 1.5二叉树遍历基本操作 1.6二叉树遍历的前中后非递归写法 1.7…

聚观早报 | 货拉拉入局跑腿业务;苹果任命首位首席人力资源官

今日要闻&#xff1a;谷歌AI聊天机器人Bard股价大跌7.4%&#xff1b;货拉拉入局跑腿业务&#xff1b;苹果任命首位首席人力资源官&#xff1b;迪士尼宣布裁员 7000 人&#xff1b;家乐福中国 COO 离职 谷歌AI聊天机器人Bard股价大跌 7.4% 2 月 8 日消息&#xff0c;谷歌人工智能…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (四)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

软件使用【SecureCRT】 SSH连接报错Key exchange failed

目录 一、原因分析 二、解决方法 三、修改文件方法 1、修改ssh_config 2、修改sshd_config 3、重新启动服务 SecureCRT连接服务器时报错&#xff0c;报错信息为&#xff1a; Key exchange failed. No compatible key exchange method. The server supports these methods…

轨迹预测算法vectorNet调研报告

前言 传统的行为预测方法是规则的&#xff0c;基于道路结构的约束生成多个行为假设。最近&#xff0c;很多基于学习的预测方法被提出。他们提出了对于不同行为假设的进行概率解释的好处&#xff0c;但是需要重构一个新的表示来编码地图和轨迹信息。有趣的是&#xff0c;虽然高精…

【论文阅读】TDANet:一种具有自上而下注意力的用于语音分离的高效自编码器架构(ICLR 2023)

TDANet: 一种具有自上而下注意力的用于语音分离的高效自编码器架构 文章目录TDANet: 一种具有自上而下注意力的用于语音分离的高效自编码器架构速览摘要方法PipelineTDANet实验总结速览 下载收录源码机构演示arxivICLR 2023PyTorch清华大学Demo inproceedings{tdanet2023iclr,…

Redis应用场景

redis的五种基本数据类型结构类型结构存储的值结构的读写能力String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作&#xff1b;对整数或浮点数进行自增或自减操作&#xff1b;List列表一个链表&#xff0c;链表上的每个节点都包含一个字符串对链表的两…

Docker进阶 - 9. docker network 之自定义网络

1. 运行两个tomcat实例&#xff0c;并进入容器内部 docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8 docker exec -it tomcat81 bashdocker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-idk8 docker exec -it tomcat82 bash2. ping一下各自的ip…