【前缀和】和为k的子数组 路径总和 III

news2024/10/5 17:28:00

文章目录

    • 和为k的子数组
    • 路径总和 III

和为k的子数组

在这里插入图片描述

动态规划算法(超时)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<vector<int>> dp(n, vector<int>(n, 0));
        int ans = 0;
        for(int i = 0; i < n; i++){
            dp[i][i] = nums[i];
            if(nums[i] == k) ans++;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                dp[i][j] = dp[i][j-1] + nums[j];
                if(dp[i][j] == k) ans++;
            }
        }
        return ans;
    }
};

前缀和(超时)

构建前缀和数组,以快速计算区间和;

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> pre_sum(n + 1, 0);
        for(int i = 0; i < n; i++){
            pre_sum[i + 1] = pre_sum[i] + nums[i];
        }
        int cnt = 0;
        for(int i = 0; i <= n; i++){
            for(int j = i + 1; j <= n; j++){
                if(pre_sum[j] - pre_sum[i] == k) cnt++;
            }
        }
        return cnt;
    }
};

使用哈希表优化前缀和

用哈希表存放从数组0号元素到各个元素的和出现的次数,key表示和的值,value表示和出现的次数。哈希表存放的key表示区间[0,0]、[0,1]、[0,2]、[0,3]、[0,4]…的和

比如nums = {1,2,3},则map中最终存放的是{{0,1},{1,1},{3,2},{6,1}}

循环累加sum的过程中,在哈希表中查找sum - k,若存在,则说明两个区间和的差为k

比如当前sum表示[0,9]区间的和,前面[0,3]、[0,5]、[0,7]区间的和是sum - k,此时mp[sum - k]是3,则说明[4,9]、[6,9]、[8,9]三个区间的和为k

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> mp;
        mp[0] = 1;  // 当前和为x,k为x,差为0,则表示当前和就是k,把从0号元素到当前元素累加起来和为k的子数组记为1次
        int sum = 0;
        int ans = 0;
        for(int num : nums){
            sum += num;
            if(mp.find(sum - k) != mp.end()){
                // 当前区间和为sum,sum和前面某几个小区间和 求差为k,说明中间某个小区间的和为k
                // 比如当前sum表示[0,9]区间的和,前面[0,3]、[0,5]、[0,7]区间的和是sum - k
                // 则说明[4,9]、[6,9]、[8,9]三个区间的和为k,此时mp[sum - k]应该是3
                ans += mp[sum - k];
            }
            // mp中不断记录从0号元素到各个元素和的值出现的次数
            mp[sum]++;
        }
        return ans;
    }
};

路径总和 III

在这里插入图片描述

在这里插入图片描述

和上一题思想比较类似,哈希表记录下从根节点到每个节点的和,采用先序遍历的方式(因为每个节点需要使用到从父节点传过来的值),遍历到每个节点时,在哈希表中查找 根节点到当前节点的和 sum - target,如果存在则说明存在从根节点到某个节点的和为sum - target,即存在一段路径的和为target

在这里插入图片描述
红色表示父节点给子节点传递的前缀和,紫色表示哈希表存储的前缀和(根节点到当前节点的和)

有一个需要注意的点:由于题目要求路径必须要从上到下的,不能从下到上在到下这种,也就是本题需要回溯,即代码中的mp[root->val + pre_sum]--

如果不加回溯这行代码

在这里插入图片描述

在遍历根节点1时,mp:{(0,1),(1,1)}

在遍历节点-2时,mp:{(0,1),(1,1),(-1,1)} ans = 1

在遍历节点-3时,mp:{(0,1),(1,1),(-1,1)} ,此时从根节点到当前节点的和sum为-2,sum - target = -1,-1在哈希表中出现了1次,而这个1次,表示从1到-2这条路径的和

sum - target = -1 ==> sum - (-1) = target

这个-1必须是sum所包含的子路径,而不应该是其他路径

所以我们遍历完某个节点,往上回溯是,需要在哈希表中当前和出现的次数 -1

class Solution {
public:
    // 哈希表中存储从根节点到各个节点的和,出现的次数
    unordered_map<long, long> mp;
    int ans;
    int target;

    // pre_sum表示从父节点传下来的和
    void dfs(TreeNode* root, long pre_sum){
        if(root == nullptr) return;
        
        // 用当前路径和root->val + pre_sum减去target,表示在map中查找是否存在某个子路径的和为root->val + pre_sum - target
        ans += mp[root->val + pre_sum - target];

        mp[root->val + pre_sum]++;
        dfs(root->left, root->val + pre_sum);
        dfs(root->right, root->val + pre_sum);
        mp[root->val + pre_sum]--;        // 当前节点遍历完成,往上回溯,从map中减去一次根节点到当前节点的和root->val + pre_sum
    }

    int pathSum(TreeNode* root, int targetSum) {
        ans = 0;
        target = targetSum;
        mp[0] = 1;
        dfs(root, 0);
        return ans;
    }
};

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

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

相关文章

b2b b2c o2o分布式电子商务平台源码 mybatis+spring cloud

鸿鹄云商大型企业分布式互联网电子商务平台&#xff0c;推出PC微信APP云服务的云商平台系统&#xff0c;其中包括B2B、B2C、C2C、O2O、新零售、直播电商等子平台。 分布式、微服务、云架构电子商务平台 java b2b2c o2o 技术解决方案 开发语言&#xff1a; java、j2ee 数据库&am…

注解@Transactional 原理和常见的坑

这篇文章&#xff0c;会先讲述 Transactional 的 4 种不生效的 Case&#xff0c;然后再通过源码解读&#xff0c;分析 Transactional 的执行原理&#xff0c;以及部分 Case 不生效的真正原因1 项目准备下面是 DB 数据和 DB 操作接口&#xff1a;uidunameusex1张三女2陈恒男3楼仔…

百万医疗险是什么

一、百万医疗险是什么 从名字可以看出&#xff0c;这是一款医疗险。因为保额高&#xff0c;最高能报销百万&#xff0c;所以叫百万医疗险。 二、百万医疗险有什么用 可以报销被保险人因意外伤害和疾病导致的医疗费用 三、如何挑选 虽然高达几百万的保额&#xff0c;但保额却并非…

cas单点登录-自定义登录界面 / 自定义主题风格(三)

cas单点登录-自定义登录界面 / 自定义主题风格&#xff08;三&#xff09; 在前面的文章中&#xff0c;介绍了使用cas实现SSO单点登录&#xff0c;静态登录&#xff0c;使用mysql数据库登录。但是在登录时都是跳转到了同一个登录界面。 假设现在我有两个子站点app1.com&#x…

【Docker】初识Dcoker以及镜像操作(一)

目录 1.初识Docker 1.1.什么是Docker 1.1.1.应用部署的环境问题 1.1.2.Docker解决依赖兼容问题 1.1.3.Docker解决操作系统环境差异 1.1.4.小结 1.2.Docker和虚拟机的区别 1.3.Docker架构 1.3.1.镜像和容器 1.3.2.DockerHub 1.3.3.Docker架构 1.3.4.小结 1.4.安装D…

Three.js铅笔手绘效果实现

在这个教程中&#xff0c;我们将学习如何使用 Three.js 后处理创建铅笔手绘效果。 我们将完成创建自定义后处理渲染通道、在 WebGL 中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。 这就是最终结果的样子&#xff0c;让我们开始…

NLP学习笔记(九) 分词(上)

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲分词算法 1 概述 分词是自然语言处理领域中的基础任务&#xff0c;是文本预处理的重要步骤 简单来说&#xff0c;就是将文本段落分解为基本语言单位&#xff0c;亦可称之为词元 ( token\text{token}token ) 按照粒度的不…

day50【代码随想录】动态规划之不同的子序列、两个字符串的删除操作、编辑距离

文章目录前言一、不同的子序列&#xff08;力扣115&#xff09;【hard】二、两个字符串的删除操作&#xff08;力扣583&#xff09;思路一思路二三、编辑距离&#xff08;力扣72&#xff09;【hard】前言 1、不同的子序列 2、两个字符串的删除操作 3、编辑距离 一、不同的子序…

网页扫描图像并以pdf格式上传到服务器端

本文描述如何通过网页驱动扫描仪、高拍仪等图像扫描设备进行图像扫描&#xff0c;扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存。图像扫描上传如文字描述顺序所介绍&#xff0c;先要驱动扫描设备工作&#xff0c;进行纸张数据的光学扫描操作形成…

Impacket工具使用

Impacket工具说明 Impacker是用户处理网络协议的Python类集合,用于对SAB1-3或IPv4/IPv6 上的TCP/UPD/ICMP/IGMP/ARP/IPv4/IPv6/SMB/MSRPC/NTLM/Kerberos/WMI/LDAP 等进行低级的编程访问,数据包可以从头开始构建,也可以从原始数据包中解析, 面向对象API使用处理协议的深层结构变…

Action Segmentation数据集介绍——Breakfast

文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast&#xff08;The Breakfast Action Dataset&#xff09;简介 早餐动作数据集包括与早餐准备相关的10个动作&#xff0c;由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…

CCIE 350-401-实验全

实验 VRRP&#xff08;hello packettimes advertise&#xff09; This is a lab item in which tasks will be performed on virtual devices. Refer to the Tasks tab to view the tasks for this lab item.Refer to the Topology tab to access the device console(s) and p…

Spring Boot自动装配的原理

Spring Boot自动装配的原理自动装配的实现EnableAutoConfigurationAutoConfigurationImportSelectorSpring Boot中的自动装配&#xff0c;它是Starter的基础&#xff0c;也是Spring Boot的核心。那么什么叫自动装配呢&#xff1f;或者说什么叫装配呢&#xff1f; 简单来说&…

Vulnhub靶场----4、DC-4

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-4下载地址&#xff1a;https://download.vulnhub.com/dc/DC-4.zip kali&#xff1a;192.168.144.148 DC-4&#xff1a;192.168.144.152 二、渗透流程 端口扫描&#xff1a;nmap -T5 -p- -sV -sT -A 192.168.144.1…

ISIS协议

ISIS协议基础简介应用场景路由计算过程地址结构路由器分类邻居Hello报文邻居关系建立DIS及DIS与DR的类比链路状态信息的载体链路状态信息的交互路由算法网络分层路由域![在这里插入图片描述](https://img-blog.csdnimg.cn/9027c43b614a4399ae1f54e87a37f047.png)区域间路由简介…

【MySQL】表操作和库操作

文章目录概念库操作1.创建数据库2.删除数据库3.选择数据库4.显示数据库列表表操作1.创建数据表CREATE2.删除数据表DROP3.插入数据INSERT4.更新数据UPDATE5.修改数据ALTER6.查询数据SELECT7.WHERE子句8.ORDER BY子句9.LIMIT子句10.GROUP BY子句11.HAVING子句使用注意事项概念 M…

Java集合(一)---List和set

1.Java集合有哪些&#xff1f;集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)Map接口和Collection接口是所有集合框架的父接口&#xff1a;1. Collection接口的子接口包括&#xff1a;Set接口和List接口2. Map接口的实现类主要有&#xf…

【Python】批量采集原神表情包~

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 最近迷上了原神&#xff0c; 不自觉中就很喜欢保存广大旅行者制作的表情包~ 真的很有意思诶~ 源码资料电子书:点击此处跳转文末名片获取 一个个保存的话&#xff0c;好像效率很低嘛… 那我就发挥我小熊猫的老本行直接给把他们全部采集下…

零基础机器学习做游戏辅助第十三课--原神自动钓鱼(三)labelimg的使用

一、什么是labelimg labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是ImageNet使用的格式。此外,它还支持 COCO数据集格式。 二、安装label…

大数据时代下的企业网络安全

在大数据技术迅猛发展的今天&#xff0c;网络安全问题已经发展成一个广受关注的热门研究方向。有人说&#xff0c;“大数据下&#xff0c;人人裸奔”&#xff0c;隐私保护、数据防护日益成为广大学者、企业研究的焦点。 面对这种安全威胁&#xff0c;企业必须实施一些有效的信…