560. 和为 K 的子数组【哈希、前缀和】

news2024/11/24 15:31:55

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。

示例 1:
输入:nums = [1,1,1], k = 2
输出:2

示例 2:
输入:nums = [1,2,3], k = 3
输出:2

提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107


C代码:哈希、前缀和

在这里插入图片描述

只需要统计有多少个前缀和 == sum - k
移动的滑动窗口的问题转换为 不断变换的前缀和的问题
【模型想象】:滑动窗口的和不变,随着滑动窗口右端向右移动的同时,窗口为满足sum一定,左端会做出对应的响应;此时,就将 总前缀和 ([0, i]的和pre[i]) - k 的问题转换为 pre[j-1]前缀和 的问题;
(每次滑动窗口均不一致,就算是每次窗口使用的都是 相同的前缀和,此时的窗口也是不一致的。例如:1 2 3 0 0 k==3)

typedef struct hashNode {
    int sum;
    int cnt;
    UT_hash_handle hh;
} HashNode;

int subarraySum(int* nums, int numsSize, int k)
{
    int cnt = 0;
    HashNode *hashSet = NULL;
    int prefixSum = 0;
    HashNode *head = (HashNode *)malloc(sizeof(HashNode));
    for (int i = 0; i < numsSize; i++) {
        HASH_FIND_INT(hashSet, &prefixSum, head);
        if (head != NULL) {
            head->cnt++;
        } else {
            head = (HashNode *)malloc(sizeof(HashNode));
            head->sum = prefixSum;
            head->cnt = 1;
            HASH_ADD_INT(hashSet, sum, head);
        }

        prefixSum += nums[i];
        int value = prefixSum - k;
        HASH_FIND_INT(hashSet, &value, head);
        if (head != NULL) {
            cnt += head->cnt;
        }
    }
    return cnt;
}

C代码:暴力、超过时间限制

int subarraySum(int* nums, int numsSize, int k){
    int cnt = 0;
    for (int i = 0; i < numsSize; ++i) {
        int sum = 0;                          // 包含负数、0
        for (int j = i; j < numsSize; ++j) {  // for遍历就包含了顺序:滑动窗口
            sum += nums[j];
            if (sum == k) {
                ++cnt;
            }
        }
    }
    return cnt;
}

C错误代码:滑动窗口没有考虑到负数和0

int subarraySum(int* nums, int numsSize, int k){
    int sum = 0;
    int cnt = 0;
    int l = 0;
    for (int i = 0; i < numsSize; ++i) {
        sum += nums[i];
        while(sum > k) {  // 没有考虑到负数和0
            sum -= nums[l];
            ++l;
        }
        if (sum == k) {
            ++cnt;
        }
    }
    return cnt;
}

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

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

相关文章

智能座舱3.0阶段,看全球巨头如何打造更具“价值”的第三空间

面向中国这一全球最大的汽车电动化与智能化单一市场&#xff0c;作为全球第七大汽车技术供应商的FORVIA佛瑞亚集团开始全面发力。 在2023年上海国际车展上&#xff0c;FORVIA佛瑞亚携旗下佛吉亚与海拉一系列突破性技术和互动体验亮相&#xff0c;展示了对电气化与能源管理、安…

SpringMVC详细介绍和@RequestMapping详细使用说明

目录 SpringMVC SpringMVC 介绍 说明是 MVC MVC 全称∶ Model 模型、View 视图、 Controller 控制器。 MVC 是一种思想 MVC 示意图 理解和解读 SpringMVC 特点&概述 梳理 Spring SpringMVC SpringBoot 的关系 SpringMVC-快速入门 SpringMVC 登录流程分析 SpringM…

OpenGL学习教程之 材质

材质 在真实世界里&#xff0c;每个物体会对光产生不同的反应。钢看起来比陶瓷花瓶更闪闪发光&#xff0c;一个木头箱子不会像钢箱子一样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体不会散射(Scatter)很多光却会反射(Reflect)很多光&#xff0c;结果看起来…

Wireshark的安装及基本使用【计算机网络】

Wireshark的安装与基本使用【计算机网络】 前言推荐Wireshark的安装与基本使用一、下载二、安装三、使用技巧四、简单使用4.1 捕获4.2 简单介绍4.3 过滤 问题 最后 前言 2023-5-4 20:51:42 以下内容源自《【计算机网络】》 仅供学习交流使用 推荐 Wireshark的下载安装及简单…

macOS 13.4Beta 4(22F5059b)With OpenCore 0.9.2开发版 and winPE双引导分区原版镜像

镜像特点 完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要&#xff0c;可以自行直接替换opencore分区文件为clover引导文件&#xff09;备注…

【软考高项笔记】第3章 信息系统治理(针对甲方)3.1 IT治理

第3章 信息系统治理&#xff08;针对甲方&#xff09; 3.1 IT治理 不同于管理&#xff0c;角度更高3.1.1 IT治理基础 目标价值 与业务目标一致 有效利用信息与数据资源 风险管理 管理层次 最高管理层 &#xff08;定目标&#xff0c;战略&#xff09; 执行管理层 &#xff08…

MySQL中添加环境变量和初始化MySQL

添加环境变量 环境变量里面有很多选项&#xff0c;这里我们只用到Path 这个参数。为什么在初始化的开始要添加环境变量呢?在黑框(即CMD) 中输入一个可执行程序的名字&#xff0c;Windows会先在环境变量中的Path所指的路径中寻找一遍&#xff0c;如果找到了就直接执行&#xf…

Android 开发中常见的架构设计模式组件化、插件化和模块化

在 Android 中&#xff0c;组件化、插件化和模块化都是很常见的架构设计手段&#xff0c;用于提高应用开发的灵活性、扩展性和复用性。组件化、插件化和模块化可以混合使用&#xff0c;根据项目的需求和规模选择合适的方案。 组件化(Componentization) 组件化是指将一个大型的…

国产!全志科技T507-H工业核心板( 4核ARM Cortex-A5)规格书

1核心板简介 创龙科技 SOM-TLT507 是一款基于全志科技 T507-H 处理器设计的 4 核 ARM Cortex-A 53 全国产工业核心板,主频高达 1.416GHz 。核心板 CPU 、ROM 、RAM、电源、晶振等所有元器件均采用国产工业级方案,国产化率 100%。 核心板通过邮票孔连接方式引出 MIPI CSI 、…

设计模式——模板方法模式

是什么&#xff1f; 在我们的实际开发中尝尝会遇到这种问题&#xff1a;在设计一个系统时知道了算法所需要的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但是某些步骤的具体实现还不知道&#xff0c;或者说某些步骤的实现与具体的环境相关&#xff0c;例如每…

CypherRat使用

cypherrat3.5 安卓远控&#xff0c;很早之前在tg下的&#xff0c;现在可能有高版本的 使用感受 图形化界面&#xff08;相比于msf&#xff09;可用于演练新场景&#xff0c;实战的话只能用xx破解版或是瑟瑟apk让人忽视风险继续安装由于国内安卓&#xff0c;部分功能失效 生成…

Android 拍照以及相册中选择(适配高版本)————上传多张照片之压缩处理、在线预览可伸缩放大(二)

______ Introduction ______ 前言 上一篇文章刚给大家总结完&#xff0c;关于上传头像的功能。此文章所述 主要是关于上传头像的具体流程以及如何对照片做裁剪处理&#xff0c;回调给控件显示&#xff1b;当然重中之重适配了Android高版本&#xff0c;有兴趣的大家可以去看一下…

PyQt5桌面应用开发(6):文件对话框

本文目录 PyQt5桌面应用系列介绍QFileDialog的静态接口QFileDialog的对象接口 示例结论后记 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌面应用开发&#xff…

linux安装node_exporter

下载 Download | Prometheus 解压 tar xvzf node_exporter-1.5.0.darwin-amd64.tar.gz 解压后有三个文件&#xff0c;分别是LICENSE、node_exporter、NOTICE 将node_exporter移动到/etc下 mv mode_exporter /etc/systemd/system 创建node_exporter.service文件 touch node_exp…

基于matlab模拟雷达接收机测试信号

一、前言 本例展示了如何模拟单基地脉冲雷达的接收信号以估计目标范围。单基地雷达将发射器与接收器并置。发射器产生一个脉冲&#xff0c;该脉冲击中目标并产生接收器接收的回波。通过测量回波在时间上的位置&#xff0c;我们可以估计目标的范围。 本示例重点介绍脉冲雷达系统…

【线程安全】死锁问题及解决方案

1. 什么是死锁 比如上一次讲到 synchronized 的时候&#xff0c;一个线程&#xff0c;对同一个对象连续加锁两次&#xff0c;如果出现阻塞等待&#xff0c;代表这个锁是不可重入锁&#xff0c;这样的线程&#xff0c;也就称为死锁&#xff01; 一旦程序进入死锁了就会导致线程僵…

低代码开发重要工具:JVS列表页字段样式配置说明

列表页中&#xff0c;通常存在各种各样的样式控制&#xff0c;例如字段宽度需要可调、字段的颜色根据内容变化等&#xff0c;那么我们接下来介绍下字段的样式控制的内容以及对应的效果。 1、字段样式控制配置位置 进入列表页的 数据配置界面&#xff0c;每个字段可以有独立的配…

在外远程控制我的世界服务器 - MCSM面板【端口映射】

文章目录 概述1.MCSManager 安装2.内网穿透2.1 安装cpolar内网穿透 3. 访问公网地址4.固定公网地址4.1 保留一个二级子域名4.2 配置固定二级域名4.3 访问固定公网地址 5. 设置节点公网地址6. 固定节点公网地址6.1 保留一个固定tcp地址6.2 配置固定TCP地址 转载自远程穿透文章&a…

从零开始学习Linux运维,成为IT领域翘楚(七)

文章目录 &#x1f525;Linux下常用软件安装_JDK和Tomcat安装&#x1f525;Linux下常用软件安装_MySQL安装&#x1f525;Linux下常用软件安装_MySQL卸载 &#x1f525;Linux下常用软件安装_JDK和Tomcat安装 Jdk 安装 解压jdk安装包 tar -zxvf jdk-8u201-linux-x64.tar.gz -C/…

中国核心生态区类型及土地利用数据有哪些,如何进行获取

全国生态功能区划是在全国生态调查的基础上&#xff0c;分析区域生态特征、生态系统服务功能与生态敏感性空间分异规律&#xff0c;确定不同地域单元的主导生态功能&#xff0c;制定全国生态功能区划&#xff0c;对贯彻落实科学发展观&#xff0c;牢固树立生态文明观念&#xf…