每日算法-250603

article/2025/6/10 9:54:37

每日算法学习

今天学习了两道关于子数组和的 LeetCode 题目。


1524. 和为奇数的子数组数目

题目

Problem 1524 Screenshot

思路 💡

前缀和

核心思想:子数组 arr[i..j] 的和可以表示为两个前缀和之差,即 prefixSum[j+1] - prefixSum[i] (假设 prefixSum[k] 表示 arr[0...k-1] 的和,且 prefixSum[0] = 0)。

我们希望这个差为奇数。根据奇偶性运算规则:

  • 奇数 - 偶数 = 奇数
  • 偶数 - 奇数 = 奇数

这意味着,如果当前的前缀和 P_current 是奇数,我们需要查找在它之前出现过的偶数前缀和的个数。反之,如果 P_current 是偶数,我们需要查找之前出现过的奇数前缀和的个数。

解题过程 ⚙️

  1. 计算前缀和数组 prefixprefix[k] 存储原数组 arr 从索引 0k-1 的元素之和。特别地,prefix[0] 通常设为 0,代表空数组的和。
  2. 遍历计算出的每一个前缀和 x (从 prefix[0] 开始):
    • 我们用一个 Map map 来存储已遍历过的前缀和中,奇数和偶数各自出现的次数。在代码中,map 的键 true 代表奇数前缀和的计数,false 代表偶数前缀和的计数。
    • 对于当前前缀和 x
      • 如果 x奇数:我们需要找到一个之前的偶数前缀和 P_prev_even,使得 x - P_prev_even 为奇数。此时,结果 ret 加上 map 中记录的偶数前缀和的个数。
      • 如果 x偶数:我们需要找到一个之前的奇数前缀和 P_prev_odd,使得 x - P_prev_odd 为奇数。此时,结果 ret 加上 map 中记录的奇数前缀和的个数。
    • 更新 map:将当前前缀和 x 的奇偶性对应的计数加 1。
  3. 初始状态:prefix[0] = 0 是一个偶数。所以在遍历开始前(或者说,在处理 prefix[0] 时),偶数前缀和的计数为 1,奇数前缀和的计数为 0。代码中通过先查询后更新的方式,巧妙地处理了这一点:当处理 prefix[0]=0 (偶数)时,它会查询奇数前缀和的个数(初始为0,所以 ret 不变),然后将偶数前缀和的个数更新为1。

复杂度 📈

  • 时间复杂度: O ( N ) O(N) O(N),其中 N 是数组 arr 的长度。计算前缀和需要 O ( N ) O(N) O(N),遍历前缀和数组也需要 O ( N ) O(N) O(N)
  • 空间复杂度: O ( N ) O(N) O(N),主要用于存储前缀和数组 prefixmap 的空间是 O ( 1 ) O(1) O(1),因为它只存储两个键值对。

Code

class Solution {public int numOfSubarrays(int[] arr) {long ret = 0;int n = arr.length;final int MOD = 1_000_000_007;int[] prefix = new int[n + 1];Map<Boolean, Integer> map = new HashMap<>(n + 1); // true - 奇数   false - 偶数for (int i = 0; i < n; i++) {prefix[i + 1] = prefix[i] + arr[i];}for (int x : prefix) {// key 为奇数就去找偶数有多少个  key为偶数就去找奇数有多少个boolean key =  (x % 2 == 0);ret = (ret + map.getOrDefault(key, 0)) % MOD;// 存进map时注意取反map.put(!key, map.getOrDefault(!key, 0) + 1);}return (int) ret;}
}

974. 和可被 K 整除的子数组

题目

Problem 974 Screenshot

思路 💡

前缀和 + 同余定理

核心思想:子数组 nums[i..j] 的和为 S = prefixSum[j+1] - prefixSum[i]
我们希望 S 能被 K 整除,即 S % K == 0

根据同余定理,如果 (A - B) % K == 0,那么 A % K == B % K

应用到这里:(prefixSum[j+1] - prefixSum[i]) % K == 0 等价于 prefixSum[j+1] % K == prefixSum[i] % K

因此,我们只需要统计具有相同余数的前缀和出现的次数。

注意处理负数取模:在 Java (以及很多语言)中,负数对正数取模的结果可能是负数 (例如 -1 % 5 = -1)。为了确保余数始终在 [0, K-1] 区间内,我们通常使用 (sum % K + K) % K

解题过程 ⚙️

  1. 初始化一个变量 prefixSum = 0 (表示当前累积的前缀和) 和结果 ret = 0
  2. 使用一个数组map来存储每个前缀和模 K余数出现的次数。map[rem] 表示余数 rem 已经出现了多少次。
  3. 关键初始化map[0] = 1。这非常重要!它代表在开始遍历数组之前,我们有一个“空前缀和”(值为0),其模 K 的余数是 0。这能够正确处理那些从数组第一个元素开始其和就能被 K 整除的子数组。
  4. 遍历数组 nums 中的每个元素 num:
    a. 更新 prefixSum += num
    b. 计算当前 prefixSumK 的余数:remainder = (prefixSum % K + K) % K
    c. 在 map 中查找这个 remainder 之前已经出现过的次数,计为 count = map[remainder]。这意味着有 count 个之前的某个前缀和 P_prev 满足 P_prev % K == remainder。对于每一个这样的 P_prev,子数组 (P_current - P_prev) 都能被 K 整除。所以,将 count 加到 ret 上:ret += count
    d. 然后,将当前 prefixSum 的余数 remainder 计入 mapmap[remainder]++

复杂度 📈

  • 时间复杂度: O ( N ) O(N) O(N),其中 N 是数组 nums 的长度。我们只遍历数组一次。
  • 空间复杂度: O ( K ) O(K) O(K)map 数组的大小固定为 K,用于存储余数的计数。

Code

class Solution {public int subarraysDivByK(int[] nums, int k) {int ret = 0, prefix = 0;int[] map = new int[k];map[0] = 1; // prefix[i] % k = 0的情况for (int num : nums) {prefix += num;ret += map[(prefix % k + k) % k]++;}return ret;}
}


http://www.hkcw.cn/article/omxdPRfqmR.shtml

相关文章

【T2I】InteractDiffusion: Interaction Control in Text-to-Image Diffusion Models

CODE: CVPR 2024 https://jiuntian.github.io/interactdiffusion Abstract 大规模文本到图像(t2i)扩散模型在基于文本描述生成连贯图像方面展示了令人难以置信的能力&#xff0c;从而在内容生成方面实现了广泛的应用。虽然最近的进步已经引入了对物体定位、姿态和图像轮廓等因…

今日行情明日机会——20250603

上证指数放量收阳线&#xff0c;阳包阴&#xff0c;量能超过5天均量&#xff0c;个股涨多跌少&#xff0c;行情有所回暖。 深证指数缩量收阳线&#xff0c;再次回打支撑位。 2025年6月3日涨停股主要行业方向分析&#xff08;基于图片数据&#xff09; 1. 医药&#xff08;政策…

Foundation Models for Generalist Geospatial Artificial Intelligence论文阅读

文章目录 摘要1. 引言2. 研究背景3. 预训练数据3.1 HLS-2数据3.2 高效数据采样3.3 预处理程序 4. 模型结构和预训练4.1 时空数据考虑4.2 预训练4.3 预训练结果 5. 下游任务5.1 任务微调数据集5.2 微调模型设置5.3 微调任务结果5.3.1 云插补任务5.3.2 洪水映射任务5.3.3 火灾痕迹…

C++实现汉诺塔游戏用户交互

目录 一、模型调整(一)模型定义(二)模型实现1.电脑自动完成部分2.SDL图形显示2.1拿起放下盘子的函数2.2左右移动手指的函数 二、处理用户输入&#xff0c;进行人机分流三、总结四、源码下载 上篇文章使用C语言实现汉诺塔游戏电脑自动完成的步骤&#xff0c;还没有实现用户交互&…

嵌入式学习 D32:系统编程--进程间通信IPC

引言--进程间通信管道的概念管道相关操作有名管道及其相关操作信号通信 一、引言--进程间通信 1&#xff09;因为空间是独立和隔绝的&#xff0c;数据发不过去&#xff0c;需要进程间的通信来交互&#xff0c;所以需要通信。 2&#xff09;linux进程间通信的常用几种方式&…

黑马Java面试笔记之 消息中间件篇(Kafka)

一. Kafka保证消息不丢失 Kafka如何保证消息不丢失 使用Kafka在消息的收发过程中都会出现消息丢失&#xff0c;Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker接收消息丢失 1.1 生产者发送消息到Brocker丢失 设置异步发送 消息…

java的SPI机制

SPI&#xff08;Service Provider Interface&#xff09;是java提供的一种服务发现机制。允许你定义一个接口或抽象类&#xff0c;然后由第三方实现这个接口&#xff0c;并在运行时动态加载这些实现类 核心思想是&#xff1a;面向接口编程&#xff0c;解耦接口与实现 核心组件…

SpringCloud 分布式锁Redisson锁的重入性 高并发 获取锁

介绍 Redisson 的锁支持 可重入性&#xff0c;这意味着同一个线程在获取锁后&#xff0c;如果再次尝试获取该锁&#xff0c;它可以成功地获得锁&#xff0c;而不会被阻塞。 每次一个线程成功获取锁后&#xff0c;它的持有次数会增加。当线程再次获取该锁时&#xff0c;Rediss…

PyTorch--池化层(4)

池化层&#xff08;Pooling Layer&#xff09; 用于降低特征图的空间维度&#xff0c;减少计算量和参数数量&#xff0c;同时保留最重要的特征信息。 池化作用&#xff1a;比如1080p视频——720p 池化层的步长默认是卷积核的大小 ceil 允许有出界部分&#xff1b;floor 不允许…

【自动思考记忆系统】demo (Java版)

背景&#xff1a;看了《人工智能》中的一段文章&#xff0c;于是有了想法。想从另一种观点&#xff08;⭕️&#xff09;出发&#xff0c;尝试编码&#xff0c;告别传统程序员一段代码解决一个问题的方式。下图是文章原文和我的思考涂鸦✍️&#xff0c;于是想写一个自动思考记…

小白的进阶之路系列之十二----人工智能从初步到精通pytorch综合运用的讲解第五部分

在本笔记本中,我们将针对Fashion-MNIST数据集训练LeNet-5的变体。Fashion-MNIST是一组描绘各种服装的图像瓦片,有十个类别标签表明所描绘的服装类型。 # PyTorch model and training necessities import torch import torch.nn as nn import torch.nn.functional as F impor…

pytorch3d+pytorch1.10+MinkowskiEngine安装

1、配置pytorch1.10cuda11.0 pip install torch1.10.1cu111 torchvision0.11.2cu111 torchaudio0.10.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html 2、配置 MinkowskiEngine库 不按下面步骤&#xff0c;出现错误 1、下载MinkowskiEngine0.5.4到本地 2、查看…

ORACLE 缺失 OracleDBConsoleorcl服务导致https://xxx:port/em 不能访问

这个原因是&#xff0c;操作过一下 ORCL的服务配置变更导致的。 再PATH中添加个环境变量&#xff0c;路径如下 管理员权限运行cmd 等待创建完成 大概3分钟 查看服务 点击第一个访问&#xff0c;下图登录后的截图

分布式流处理与消息传递——向量时钟 (Vector Clocks) 算法详解

Java 实现向量时钟 (Vector Clocks) 算法详解 一、向量时钟核心原理 #mermaid-svg-JcZ1GT0r1ZNSy6W7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JcZ1GT0r1ZNSy6W7 .error-icon{fill:#552222;}#mermaid-svg-JcZ…

深入浅出:Oracle 数据库 SQL 执行计划查看详解(1)——基础概念与查看方式

背景 在当今的软件开发领域&#xff0c;尽管主流开发模式往往倾向于采用单表模式&#xff0c;力图尽可能地减少表之间的连接操作&#xff0c;以期达到提高数据处理效率、简化应用逻辑等目的。然而&#xff0c;对于那些已经上线运行多年的运维老系统而言&#xff0c;它们内部往…

多模态大语言模型arxiv论文略读(104)

Talk Less, Interact Better: Evaluating In-context Conversational Adaptation in Multimodal LLMs ➡️ 论文标题&#xff1a;Talk Less, Interact Better: Evaluating In-context Conversational Adaptation in Multimodal LLMs ➡️ 论文作者&#xff1a;Yilun Hua, Yoav…

【Oracle】游标

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 游标基础概述1.1 游标的概念与作用1.2 游标的生命周期1.3 游标的分类 2. 显式游标2.1 显式游标的基本语法2.1.1 声明游标2.1.2 带参数的游标 2.2 游标的基本操作2.2.1 完整的游标操作示例 2.3 游标属性2.3.1…

Ethernet/IP转DeviceNet网关:驱动大型矿山自动化升级的核心纽带

在大型矿山自动化系统中&#xff0c;如何高效整合新老设备、打通数据孤岛、实现统一控制&#xff0c;是提升效率与安全的关键挑战。JH-EIP-DVN疆鸿智能EtherNet/IP转DeviceNet网关&#xff0c;正是解决这一难题的核心桥梁&#xff0c;为矿山各环节注入强劲连接力&#xff1a; …

Nginx + Tomcat 负载均衡、动静分离群集

一、 nginx 简介 Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在 BSD-like 协议下发行。其特点是占有内存少&#xff0c;并发能力强&#xff0c;在同类型的网页服务器中表现优异&#xff0c;常用…

5.Nginx+Tomcat负载均衡群集

Tomcat服务器应用场景&#xff1a;tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;Tomcat虽然和Apache或…