【LeetCode每日一题】——523.连续的子数组和

news2024/10/20 22:41:10

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 前缀和

二【题目难度】

  • 中等

三【题目编号】

  • 523.连续的子数组和

四【题目描述】

  • 给你一个整数数组 nums 和一个整数 k ,如果 nums 有一个 好的子数组 返回 true ,否则返回 false
  • 一个 好的子数组 是:
    • 长度 至少为 2 ,且
    • 子数组元素总和为 k 的倍数。
  • 注意:
    • 子数组 是数组中 连续 的部分。
    • 如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 xk 的一个倍数。0 始终 视为 k 的一个倍数。

五【题目示例】

  • 示例 1

    • 输入:nums = [23,2,4,6,7], k = 6
    • 输出:true
    • 解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。
  • 示例 2

    • 输入:nums = [23,2,6,4,7], k = 6
    • 输出:true
    • 解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。
      42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。
  • 示例 3

    • 输入:nums = [23,2,6,4,7], k = 13
    • 输出:false

六【题目提示】

  • 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
  • 0 < = n u m s [ i ] < = 1 0 9 0 <= nums[i] <= 10^9 0<=nums[i]<=109
  • 0 < = s u m ( n u m s [ i ] ) < = 2 31 − 1 0 <= sum(nums[i]) <= 2^{31} - 1 0<=sum(nums[i])<=2311
  • 1 < = k < = 2 31 − 1 1 <= k <= 2^{31} - 1 1<=k<=2311

七【解题思路】

  • 前缀和思想:设 prefix_sum[i] 表示数组 nums 的前缀和,即 prefix_sum[i] 表示 nums 从第 0 到第 i 的元素的和。对于任意两个下标 ij(i < j),子数组 nums[i+1:j+1] 的和可以表示为 prefix_sum[j] - prefix_sum[i]
  • 取模运算:我们需要找到两个前缀和 prefix_sum[j] 和 prefix_sum[i],使得它们的差 prefix_sum[j] - prefix_sum[i]k 的倍数。我们可以通过对前缀和取模的方式(哈希表)来简化这个问题:如果 prefix_sum[j] % k == prefix_sum[i] % k,那么 prefix_sum[j] - prefix_sum[i] 一定是 k 的倍数(同余定理)。
  • 边界情况处理:
    • 如果 k == 0,则子数组的和必须为 0,所以需要特判。
    • 由于子数组的长度至少为 2,所以当找到满足条件的前缀和时,还需要确保两个下标之间的距离大于等于 2
  • 最后返回结果即可
  • 具体细节可以参考下面的代码

八【时间频度】

  • 时间复杂度: O ( m ) O(m) O(m) m m m为传入的数组的长度
  • 空间复杂度: O ( m i n ( m , k ) ) O(min(m, k)) O(min(m,k)) m m m为传入的数组的长度, k k k为计算得到的余数的个数

九【代码实现】

  1. Java语言版
class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        // 用于存储取模后的前缀和与其下标, 初始化表示前缀和为0时在-1位置
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        hashMap.put(0, -1);
        // 初始化前缀和
        int prefixSum = 0;
        for (int i = 0; i < nums.length; i++) {
            // 更新前缀和
            prefixSum += nums[i];
            if (k != 0) {
                // 对 k 取模
                prefixSum %= k;
            }
            // 检查当前取模后的前缀和是否已经在哈希表中
            if (hashMap.containsKey(prefixSum)) {
                // 如果存在,并且下标差大于等于 2,则找到符合条件的子数组
                if (i - hashMap.get(prefixSum) > 1) {
                    return true;
                }
            } else {
                // 不存在则记录当前前缀和对应的下标
                hashMap.put(prefixSum, i);
            }
        }
        return false;
    }
}
  1. Python语言版
class Solution:
    def checkSubarraySum(self, nums: List[int], k: int) -> bool:
         # 用于存储取模后的前缀和与其下标, 初始化表示前缀和为0时在-1位置
        hash_map = {0: -1}
        # 初始化前缀和
        prefix_sum = 0
        for i, num in enumerate(nums):
            # 更新前缀和
            prefix_sum += num
            if k != 0:
                # 对 k 取模
                prefix_sum %= k
            # 检查当前取模后的前缀和是否已经在哈希表中
            if prefix_sum in hash_map:
                # 如果存在,并且下标差大于等于 2,则找到符合条件的子数组
                if i - hash_map[prefix_sum] > 1:
                    return True
            else:
                # 不存在则记录当前前缀和对应的下标
                hash_map[prefix_sum] = i
        return False
  1. C++语言版
class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        // 用于存储取模后的前缀和与其下标, 初始化表示前缀和为0时在-1位置
        unordered_map<int, int> hashMap;
        hashMap[0] = -1;
        // 初始化前缀和
        int prefixSum = 0;
        for (int i = 0; i < nums.size(); i++) {
            // 更新前缀和
            prefixSum += nums[i];
            if (k != 0) {
                // 对 k 取模
                prefixSum %= k;
            }
            // 检查当前取模后的前缀和是否已经在哈希表中
            if (hashMap.find(prefixSum) != hashMap.end()) {
                // 如果存在,并且下标差大于等于 2,则找到符合条件的子数组
                if (i - hashMap[prefixSum] > 1) {
                    return true;
                }
            } else {
                // 不存在则记录当前前缀和对应的下标
                hashMap[prefixSum] = i;
            }
        }
        return false;
    }
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C++语言版
    在这里插入图片描述

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

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

相关文章

github学生认证(白嫖copilot)-Why are you not on campus?不在校园内

详细申请操作流程可参考如下博文&#xff1a;从0开始的github学生认证并使用copilot教程&#xff08;超详细&#xff01;&#xff09;_copilot学生认证-CSDN博客 在此记录解决“Why are you not on campus?”提示的方法&#xff1a; 当出现这个提示时&#xff0c;说明在选择学…

2024年底蓝奏云最新可用API接口列表 支持优享版 无需手动抓取cookie

Lanzou Pro V1 接口列表 API状态版本路由获取文件与目录✅^1.0.1/v1/getFilesAndDirectories?url{}&page{}获取目录✅^1.0.0/v1/getDirectory?url{}获取文件✅^1.0.1/v1/getFiles?url{}&page{}搜索文件✅^1.0.0/v1/searchFile?url{}&wd{}依Id解析✅^1.0.2/v1/…

从0-1实战演练后台管理系统 (2)从零开始:Pure Admin 环境搭建完全指南,小白也能轻松掌握!

在开始使用Pure Admin之前&#xff0c;我们需要先了解一下Pure Admin是什么? vue-pure-admin (opens new window)是一款开源完全免费且开箱即用的中后台管理系统模版。完全采用 ECMAScript 模块&#xff08;ESM&#xff09;规范来编写和组织代码&#xff0c;使用了最新的 Vue3…

【原创】java+ssm+mysql计算机等级考试网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【ESP32-IDFV5.3.1开发】带SSL的MQTT-demo连接教程

目录 1.VSCODE以及IDF环境配置(略) 2.准备demo 2.1打开VSCODE&#xff0c;主菜单创建示例 找到SSL对应demo&#xff0c;点击创建&#xff0c;并成功创建项目&#xff0c;点击编译&#xff0c;显示编译成功即可以下一步。 确认该demo支持的开发板是你手上的开发板 3.修改demo配…

论文略读:Graph Neural Processes for Spatio-Temporal Extrapolation

2023 KDD 1 背景 时空图数据&#xff0c;无论是交通数据&#xff0c;还是空气质量数据&#xff0c;气候数据。在理想情况下&#xff0c;这些数据应该是细粒度的。 但由于高昂的成本&#xff0c;在某一地区部署和维护足够多的传感器往往是不现实的 ——>因此&#xff0c;许…

Android Studio 的 Gradle 任务列表只显示测试任务

问题现象如下&#xff1a; 问题原因&#xff1a; 这是因为Android Studio 设置中勾选了屏蔽其他gradle任务的选项。 解决方法&#xff1a; File -> Settings -> Experimental 取消勾选Only include test tasks in the Gradle task list generated during Gradle Sync&…

【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

官网&#xff1a; 1、xlsx-js-style xlsx-js-style | xlsx-js-style homepage 2、xlsx SheetJS 中文网 一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出&#xff0c;不可以修改样式&#xff0c;直接xlsx-s…

Netty通信过程中编解码技术

Netty通信过程中编解码技术 粘包/拆包问题为什么有拆包/粘包MTU最大传输单元和MSS最大分段大小滑动窗口TCP报文如何确保数据包按次序到达且不丢数据Nagle算法 拆包/粘包解决方案 Netty实现自定义通信协议通信协议设计Netty如何实现自定义通信协议 粘包/拆包问题 如何获取一个完…

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…

全新子比主题7.9.2开心版 子比主题最新版源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 wordpress zibll子比主题7.9.2开心版 修复评论弹授权 可做付费下载站 含wordpress搭建视频教程zibll子比主题安装视频教程支付配置视频教程&#xff0c;视频都是语音讲解&#xff0c;…

计算机通信与网络实验笔记

1.LINUX通过版本号判断是否为稳定版本 2.计网基础 &#xff08;CD&#xff09;&#xff0c;默认二层以太网交换机。 &#xff08;10&#xff09;物理层是均分&#xff08;除以&#xff09;&#xff0c;数据链路层及以上是不除的。 3.传输介质&#xff1a; &#xff08;1&…

ssm医院交互系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…

网络参考模型总结

物理层&#xff1a; 电信号&#xff0c;有中继器、集线器等设备。 数据链路层&#xff1a;帧&#xff0c;有网桥、交换机等设备&#xff0c;通过mac地址。 网络层&#xff1a;包&#xff0c;有路由器等设备&#xff0c;通过IP地址。 传输层&#xff1a;段&#xff0c;有网…

windows安装cuda与cudnn

目录 cuda安装 前期准备 查看电脑支持的cuda版 方式一 方式二 安装与配置 官网下载安装包 安装 安装检验 环境变量检查&#xff08;可选&#xff09; 卸载 cudnn安装 安装包下载 配置 环境变量配置 安装检验 ​编辑 cuda安装 前期准备 查看电脑支持的cuda版 方…

AtCoder ABC375 A-D题解

省流&#xff1a;史上最难 C 且 C>D。 比赛链接:ABC375 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,ans;string S;cin>>N>>S;for(int i0;i<(N-2);i){if(S[i]# && S[i2]# && S[i1].)ans;}cout…

探索光耦:一文读懂光耦的结构与原理

光耦&#xff0c;全称为光电耦合器&#xff0c;是一种将电信号转换为光信号&#xff0c;再由光信号转换回电信号的器件。它巧妙地穿梭于电信号与光信号之间&#xff0c;实现信号的无缝转换与电气隔离。 光耦的结构与原理 光耦通常由发光二极管&#xff08;LED&#xff09;和光…

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

day4:用户-用户组

一&#xff0c;用户和用户组的概述 用户与用户组的概述与作用 用户&#xff08;User&#xff09;&#xff1a; 用户是操作系统中的基本单位&#xff0c;每个用户都有自己的唯一标识&#xff08;UID&#xff09;。用户可以登录系统并执行各种操作&#xff0c;但受到权限的限制。…