【优选算法】(第十五篇)

news2024/11/17 15:51:26

目录

和为k的⼦数组(medium)

题目解析

讲解算法原理

编写代码

和可被K整除的⼦数组(medium)

题目解析

讲解算法原理

编写代码


和为k的⼦数组(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组nums和⼀个整数k,请你统计并返回该数组中和为k的连续⼦数组的个数。
⽰例1:
输⼊:nums=[1,1,1],k=2
输出:2
⽰例2:
输⼊:nums=[1,2,3],k=3
输出:2
提⽰:
1<=nums.length<=2*10^4
-1000<=nums[i]<=1000
-10^7<=k<=10^7

讲解算法原理

解法⼀(将前缀和存在哈希表中):
算法思路:

设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。
想知道有多少个「以 i 为结尾的和为 k 的⼦数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和为 k 。那么 [0, x] 区间内的和是不是就是
sum[i] - k 了。于是问题就变成:
◦ 找到在 [0, i - 1] 区间内,有多少前缀和等于 sum[i] - k 的即可。
我们不⽤真的初始化⼀个前缀和数组,因为我们只关⼼在 i 位置之前,有多少个前缀和等于
sum[i] - k 。因此,我们仅需⽤⼀个哈希表,⼀边求当前位置的前缀和,⼀边存下之前每⼀种
前缀和出现的次数。 

编写代码

c++算法代码:

class Solution
{
public:
 int subarraySum(vector<int>& nums, int k) 
 {
 unordered_map<int, int> hash; // 统计前缀和出现的次数
 hash[0] = 1;
 int sum = 0, ret = 0;
 for(auto x : nums)
 {
 sum += x; // 计算当前位置的前缀和
 if(hash.count(sum - k)) ret += hash[sum - k]; // 统计个数
 hash[sum]++;
 }
 return ret;
 }
};

java算法代码:

class Solution {
 public int subarraySum(int[] nums, int k) {
 Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
 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整除的⼦数组(medium)

题目解析

(本题是某一年蓝桥杯竞赛原题)

1.题目链接:. - 力扣(LeetCode)

2。题目描述

给定⼀个整数数组nums和⼀个整数k,返回其中元素之和可被k整除的(连续、⾮空)⼦数组的数⽬。
⼦数组是数组的连续部分。
⽰例1:
输⼊:
nums=[4,5,0,-2,-3,1],k=5
输出:
7
解释:
有7个⼦数组满⾜其元素之和可被k=5整除:
[4,5,0,-2,-3,1],[5],[5,0],[5,0,-2,-3],[0],[0,-2,-3],[-2,-3]
⽰例2:
输⼊:
nums=[5],k=9
输出:
0
提⽰:
1<=nums.length<=3*104
-104<=nums[i]<=104
2<=k<=104

讲解算法原理

解法(前缀和在哈希表中):
(暴⼒解法就是枚举出所有的⼦数组的和,这⾥不再赘述。)
本题需要的前置知识:
• 同余定理
如果 (a - b) % n == 0 ,那么我们可以得到⼀个结论: a % n == b % n 。⽤⽂字叙述就是,如果两个数相减的差能被n整除,那么这两个数对n取模的结果相同。
例如: (26 - 2) % 12 == 0 ,那么 26 % 12 == 2 % 12 == 2 。
• c++ 中负数取模的结果,以及如何修正「负数取模」的结果
a. c++ 中关于负数的取模运算,结果是「把负数当成正数,取模之后的结果加上⼀个负号」。
例如: -1 % 3 = -(1 % 3) = -1
b. 因为有负数,为了防⽌发⽣「出现负数」的结果,以 (a % n + n) % n 的形式输出保证为
正。
例如: -1 % 3 = (-1 % 3 + 3) % 3 = 2

算法思路:
思路与560.和为K的⼦数组这道题的思路相似。

设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。
• 想知道有多少个「以 i 为结尾的可被 k 整除的⼦数组」,就要找到有多少个起始位置为 x1, 
x2, x3... 使得 [x, i] 区间内的所有元素的和可被 k 整除。
• 设 [0, x - 1] 区间内所有元素之和等于 a , [0, i] 区间内所有元素的和等于 b ,可得
(b - a) % k == 0 。
• 由同余定理可得, [0, x - 1] 区间与 [0, i] 区间内的前缀和同余。于是问题就变成:
◦ 找到在 [0, i - 1] 区间内,有多少前缀和的余数等于 sum[i] % k 的即可。
我们不⽤真的初始化⼀个前缀和数组,因为我们只关⼼在 i 位置之前,有多少个前缀和等于
sum[i] - k 。因此,我们仅需⽤⼀个哈希表,⼀边求当前位置的前缀和,⼀边存下之前每⼀种前
缀和出现的次数。 

编写代码

c++算法代码:

class Solution
{
public:
 int subarraysDivByK(vector<int>& nums, int k) 
 {
 unordered_map<int, int> hash;
 hash[0 % k] = 1; // 0 这个数的余数
 int sum = 0, ret = 0;
 for(auto x : nums)
 {
 sum += x; // 算出当前位置的前缀和
 int r = (sum % k + k) % k; // 修正后的余数
 if(hash.count(r)) ret += hash[r]; // 统计结果
 hash[r]++;
 }
 return ret;
 }
};

java算法原理:

class Solution {
 public int subarraysDivByK(int[] nums, int k) {
 Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
 hash.put(0 % k, 1);
 int sum = 0, ret = 0;
 for(int x : nums)
 {
 sum += x; // 计算当前位置的前缀和
 int r = (sum % k + k) % k;
 ret += hash.getOrDefault(r, 0); // 统计结果
 hash.put(r, hash.getOrDefault(r, 0) + 1);
 }
 return ret;
 }
}

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

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

相关文章

【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000010 案列 EXCEL单元格格式。EXCEL文本型和常规型转…

TypeScript 算法手册 【归并排序】

文章目录 1. 归并排序简介1.1 归并排序定义1.2 归并排序特点 2. 归并排序步骤过程拆解2.1 分割数组2.2 递归排序2.3 合并有序数组 3. 归并排序的优化3.1 原地归并排序3.2 混合插入排序案例代码和动态图 4. 归并排序的优点5. 归并排序的缺点总结 【 已更新完 TypeScript 设计模式…

nature reviews genetics | 基因调控网络方法总结

–https://doi.org/10.1038/s41576-023-00618-5 Gene regulatory network inference in the era of single-cell multi-omics 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和单位 Julio Saez-Rodriguez—Heidelberg University Ricard Arge…

Let‘s Encrypt 的几个常用命令

Lets Encrypt 是免费的 ssl 证书提供商&#xff0c;在当前纷纷收费的形式下&#xff0c;这是一个良心厂家&#xff0c;虽然使用起来略微繁琐。坚决抵制某 cxxn 站&#xff0c;竟然开始有辣么多收费的东西。这里记录几个常用的命令&#xff08;使用环境Ubuntu 24&#xff09;&am…

Proxmox使用tc给虚拟机限速,实现不对等网速——浪浪云

文章目录 前言第一步查看虚拟机的虚拟网卡名字第二部 设置上传速度限制第三部 设置下载速度限制第四部 验证是否成功查看队列调度器查看过滤器 第五步 如何解除网卡限速 前言 由于proxmox虚拟机限速只能限速对等&#xff0c;但是我想让下载和上传速度不对等&#xff0c;例如上传…

录屏软件大比拼:四款必备工具助你轻松录制精彩瞬间!

哎呀&#xff0c;说到电脑录屏这事儿&#xff0c;我这个办公室小文员可是深有体会啊&#xff01;平时工作里&#xff0c;经常需要录个会议啊、做个教程啊&#xff0c;或者分享个操作技巧给同事们看。市面上的录屏软件多得数不清&#xff0c;但我最常用的几款工具。今天就来跟大…

Vue3 proxy跨域代理

一、跨域问题 假设vue项目的运行地址为&#xff1a;http://localhost:5173&#xff0c;此时我们想要调用后端服务的rest api&#xff0c;而后端接口暴露的地址为&#xff1a;https://192.168.1.1:8080/user。 可以发现前端服务与后端服务的域名是不同的&#xff0c;默认情况下…

C语言 | Leetcode C语言题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){int stack1[100];int stack2[100];int top1 0;int top2 0;int carry 0;int sum 0;struct ListNode* temp NULL;struct ListNode* head NULL;while (l1) {…

基于ssm大学生自主学习网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1、毕业论文&#xff08;设计&#xff09;的背景及意义&#xff1a; &#xff08;1&#xff09;研究背景 目前&#xff0c;因特网是世界上最大的计算机互联网络&#xff0c;它通过网络设备将世界各地互相独立的不同规模的局域…

五、Drf权限组件

五、权限组件 权限组件=[权限类,权限类,权限类…] 执行所有权限类的has_permission方法,通过返回True,不通过返回False 默认情况下,所有的权限类都通过,才返回True 5.1简单应用权限组件 #ext.per class MyPermission1(BasePermission):def has_permission(self, requ…

Redis篇(Redis原理 - 网络模型)

目录 一、用户空间和内核态空间 二、阻塞IO 三、非阻塞IO 四、IO多路复用 五、IO多路复用-select方式 六、IO多路复用模型-poll模式 七、IO多路复用模型-epoll函数 八、网络模型-epoll中的ET和LT 九、网络模型-基于epoll的服务器端流程 十、网络模型-信号驱动 异步IO…

Linux安装RabbitMQ安装

1. RabbitMQ介绍 1.1 RabbitMQ关键特性 异步消息传递&#xff1a;允许应用程序在不直接进行网络调用的情况下交换消息。 可靠性&#xff1a;支持消息持久化&#xff0c;确保消息不会在系统故障时丢失。 灵活的路由&#xff1a;支持多种路由选项&#xff0c;包括直接、主题、…

7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)

前言 目录 新增套餐 需求分析和设计 代码开发 根据分类id查询菜品 Controller层 Service层 ServiceImpl层 Mapper层 DishMapper.xml 新增套餐 实体类 mapper层 Service层 ServiceImpl层 Mapper层 SetmealMapper.xml setmealDishMapper.xml 套餐分页查询 需求分…

网络协议详解--IPv6

IPv6产生背景 &#xff08;1&#xff09;地址空间的耗尽&#xff1a;因特网呈指数级发展&#xff0c;导致IPv4地址空间几乎耗尽。虽然采用了子网划分、CIDR和NAT地址转换技术&#xff0c;但这没有从根源解决地址耗尽的问题 &#xff08;2&#xff09;IP层安全需求的增长&#x…

【拥抱AIGC】通义灵码策略配置

通义灵码企业级策配置支持智能问答、行间代码生成安全过滤器相关策略配置。 适用版本 企业标准版、企业专属版 通义灵码管理员、组织内全局管理员&#xff08;专属版&#xff09;在通义灵码控制台的策略配置中进行安全过滤器的配置&#xff0c;开启后&#xff0c;企业内开发…

第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组第二套)

一.题目分析 &#xff08;1&#xff09;.题目 &#xff08;2&#xff09;.题目分析 1..按键功能分析 a. B1界面切换 b. B2每次按下&#xff0c;PA6手动模式占空比参数增加10% c. B3每次按下&#xff0c;PA7手动模式占空比参数增加10% d. B4模式切换 f. 在数据显示界面下…

JAVA姓氏头像情侣头像家庭头像签名头像谐音顽埂头像设计小程序头像大全系统小程序源码

姓氏头像到谐音梗&#xff0c;打造你的专属头像大全系统 &#x1f3a8;✨ &#x1f468;‍&#x1f469;‍&#x1f467;‍&#x1f466; 家庭头像&#xff1a;记录温馨瞬间 在这个充满爱的时代&#xff0c;用一张家庭头像来记录你和家人的美好瞬间吧&#xff01;我们的“姓氏…

Linux 进程状态、僵尸进程与孤儿进程

目录 0.前言 1. 进程状态 1.1 定义 1.2 常见进程 2.僵尸进程 2.1 定义 2.2 示例 2.3 僵尸进程的危害与防止方法 3. 孤儿进程 3.1 介绍 3.2 示例 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在上一篇文章中&#xff0c;我们介绍了进程的基本概念、进程控制块&#…

Python Flask 和 Django 的区别与适用场景

Flask 和 Django 的异同&#xff08;结合代码解释&#xff09; Flask 和 Django 是两个流行的 Python Web 框架。尽管它们都是用于构建 Web 应用程序的强大工具&#xff0c;但它们的设计哲学、功能和用法有很大的区别。通过代码示例&#xff0c;可以更直观地理解 Flask 和 Dja…

基础岛第1关:书生大模型全链路开源体系

了解书生浦语大模型体系&#xff1a;书生浦语 InternLM2.5 系列模型&#xff1a; 卓越的推理性能&#xff1a;在数学推理方面取得了同量级模型最优精度&#xff0c;超越了 Llama3 和 Gemma2-9B。有效支持百万字超长上下文&#xff1a;模型在 1 百万字长输入中几乎完美地实现长…