LeetCode 523. Continuous Subarray Sum 解题报告

2023-11-14

LeetCode 523. Continuous Subarray Sum 解题报告

题目描述

Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size at least 2 that sums up to the multiple of k, that is, sums up to n*k where n is also an integer.


示例

Example 1:
example1

Example 2:
example2


注意事项

1.The length of the array won’t exceed 10,000.
2.You may assume the sum of all the numbers is in the range of a signed 32-bit integer


解题思路

我的思路:

这道题是求给定的一个序列中是否存在一个连续子序列,满足子序列元素之和为k的倍数。最简单的办法,当然是暴力破解,通过二重循环,第一个重循环枚举每一个起点位置,第二重循环遍历以当前起点位置开始,各个长度的连续子序列,一旦找到和为K的倍数就直接返回true,如果一直都没找到就直接返回false,唯一需要注意的地方是几个特殊的测试用例,如nums = [1, 2], k = 0和nums = [0,0], k = 0。所以下面实现代码中的判断的条件才会略显复杂,时间复杂度是O( n2 ),空间复杂度是O(1)。
当然这道题可以用动态规划的思路去做,但是实现的时会发现时间复杂度接近O( n2 ),而空间复杂度比暴力破解更糟糕,会是O( n ),所以就不贴出来我自己实现的动态规划的代码,如果有更好的动态规划的实现方式欢迎评论告知。

参考思路:

在讨论里有个大神给出了时间复杂度是O(n)的解法,他的思路非常巧妙,用了数学上的知识,下面给出他的解法的原理:
假设:

a[i]+a[i+1]+...+a[j]=n1k+q;

如果存在一个n
n>ja[i]+a[i+1]+...+a[j]+...+a[n]=n2k+q;

那么
a[j+1]+...+a[n]=(n2n1)k

因此利用这一结果,可以从序列第一个元素开始遍历,不断累加上当前的元素,并求出当前和除以k后的余数,用一个映射记录该余数出现时的下标,如果同一个余数出现了两次,并且两次出现的下标之差大于1,那么就表示在这两个坐标之间的元素之和是k的倍数,因此就可以返回true,否则最后返回false。
需要注意的两个地方:
1. k可能取0,所以只有当k不为0时才对当前的和求余,同时针对于nums = [0, 0], k = 0的情况,需要添加一个初始映射(0, -1)来确保结果的正确。
2. 下标之差至少为2才算是正确的情况,因为题目要求子序列长度至少为2,以上面的例子就是n至少等于j+2。
具体实现见下面参考代码。


代码

我的代码

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        if (nums.size () < 2)
            return false;

        int sum = 0;

        for (int i = 0; i < nums.size () - 1; i++) {
            sum += nums[i];
            for (int j = i + 1; j < nums.size (); j++) {
                sum += nums[j];
                if ((k != 0 && sum % k == 0) ||(k == 0 && sum == 0))
                    return true;
            }
            sum = 0;
        }

        return false;
    }
};

参考代码:

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        map<int, int> m;
        map<int, int>::iterator itr = m.end();
        int sum = 0;

        m[0] = -1;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];

            if (k)
                sum %= k;

            itr = m.find(sum);

            if (itr != m.end()) {
                if (i - itr->second > 1)
                    return true;
            }
            else
                m[sum] = i;
        }

        return false;
    }
};

总结

这道题是LeetCode Weekly Contest 21的第二道题,子序列和问题有很多变种,和为k倍数问题是其中一种,题目难度不大,可以用各种方式去做,只要注意k取0 的情况就行。
很多简单的数学性质都是一种很好的算法,所以以后做题时真的除了考虑数据结构外,还得多想想涉及到数学性质,说不定会有更好的解法。这周会再做几道分治相关的题目,坚持刷题,加油~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 523. Continuous Subarray Sum 解题报告 的相关文章

随机推荐

  • C语言中的&&符号用法

    在用KEIL5进行编程时 发现这些问题 if RX buf 5 FUNCSTOP RX buf 5 0x01 是逻辑运算符 表示逻辑与 是位运算符 表示按位与 1 2 0 条件判断为假 1 2 1 此时条件判断为真
  • Binary Search Tree

    二叉查找树 Binary Search Tree 又 二叉搜索树 二叉排序树 它或者是一棵空树 或者是具有下列性质的二叉树 a 若它的左子树不空 则左子树上所有结点的值均小于它的根结点的值 b 若它的右子树不空 则右子树上所有结点的值均大于
  • 计算机速度快的秘诀二进制,比二进制计算机速度至少快1到3.6倍的二进制小孔倒像制计算机.pdf...

    该文章介绍了一种 二进制小孔倒像制 计算机 其理论运算速度比普通二进制计算机快1 3 6倍 该计算机从原理来看 较接近于前苏联研制的三进制计算机 Generated by Foxit PDF Creator Foxit Software F
  • PHP头条爬虫,今日头条爬虫分析-爬取用户发的所有内容

    今日头条的用户页数据爬取跟频道页的数据爬取大部分很类似 但稍微有一点不一样 就是用户主页的接口signature有点不一样 需要将当前爬取的用户id和分页时间戳一起作为入参传递进去才能获取到真正的signature 除了这一点差异外其他的都
  • nova mitaka ReleaseNotes

    nova mitaka ReleaseNotes nova mitaka ReleaseNotes 概要 新特性 升级注意点 废弃列表主要针对配置项 概要 API的微版本号增加到了v2 25 新增数据库nova api 新增nova man
  • 云盘下载利器proxyee-down

    前几年360百度腾讯等大佬把用户都养成了使用云盘下载的习惯 但是后期都改为收费服务 免费的基本也都限速了 弄得大家分享下载一些资源很麻烦 一个VS神马动辄几个GB 百度100k的龟速 好吧 感谢伟大的github 感谢monkeyWie 为
  • 关于副业怎么发快手引流,教你如何把快手变成自己的副业

    快手上面的赚钱玩法也分很多种 这里蜘蛛火讲几种暴利的玩法 分别是自己拍短视频 免费送 自己直播 和打板引流 自己拍短视频 如果确定是自己拍 首先要定位一个想切入的领域 比如水果电商 很多的农民平时在家乡种的果子都很不错 但是苦于没有办法宣传
  • 数字图像处理之浮雕效果——基于傅里叶变换的频域操作

    问题简述 这是信号与系统课程的一个课后作业 要求运用傅里叶变换的理论知识 在matlab中对数字图像进行浮雕效果的处理 浮雕效果和图像边缘的检测差不多 学习过深度学习的同学可能会想到使用核对图像进行卷积操作 吴恩达老师在DeepLearni
  • Python之字典一个key对应多个value

    python的字典是一个key对应一个value 如果想要一个key对应多个value 那么可以用以下几种方法来实现 方法一 创建key对应列表 name list Mary Jack age list 10 12 stu dict nam
  • C++中 语句 #ifndef …详解

    C 中 语句 ifndef define endif 其作用是防止头文件的重复包含和编译 如果被定义则返回假 如果没有被定义则返回真 需要注意的是 ifndef起到的效果是防止一个源文件两次包含同一个头文件 而不是防止两个源文件包含同一个头
  • spark streaming job监控

    定时检查spark streaming job 运行状态保存到mysql中 1 python3保存数据到mysql vi rlt log job dinc py import pymysql import logging import pa
  • ansys选择一个面上所有节点_利用APDL命令选择椭球面上的节点

    微信公众号 CAE技术分享 问题的背景 笔者在利用Workbench的二次开发功能实现某模型的参数化建模 分网 加载时 由于workbench开发接口的限制 需要结合DM模块 MAPDL模块 Mesh模块 FEM模块以及Mechnical模
  • ELK日志分析系统原理与部署

    文章目录 一 ELK日志分析系统简介 1 1ELK日志分析系统组成 1 2日志处理步骤 二 三款软件各自概念 2 1Elasticsearch介绍 2 2Logstash介绍 2 3Kibana介绍 三 ELK日志分析系统部署 3 1实验环
  • Leetcode刷题之回文链表和交换链表中的结点

    竭力履行你的义务 你应该就会知道 你到底有多大的价值 列夫 托尔斯泰 目录 一 回文链表 1 快慢指针 2 把值存入数组中 然后使用双指针 二 交换链表中的结点 1 快慢指针 一 回文链表 给你一个单链表的头节点 head 请你判断该链表是
  • Spring 框架中都用到了哪些设计模式

    1 工厂模式 BeanFactory就是简单工厂模式的体现 用来创建对象的实例 2 单例模式 Bean默认为单例模式 3 代理模式 Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术 4 模板方法 用来解决代码重复的问
  • Python:Docx文档模板创建使用

    博文作者 wangzirui32 喜欢的可以 点赞 收藏 关注哦 本文首发于CSDN 未经许可禁止转载 Hello 大家好 我是wangzirui32 今天我们来学习Docx文档模板创建与使用 开始学习吧 1 Docxtpl Docxtpl
  • 服务器加cpu显示broadwell,英特尔新的Broadwell Xeon服务器CPU每个插槽可提供多达22个内核...

    英特尔的主流消费类处理器主要是双核和四核处理器 但是服务器CPU的性能要高得多 恰当的例子 基于Broadwell的新型Xeon E5 2600 v4系列中最昂贵的成员具有高达22个内核 运行频率为2 2GHz 而所有这些内核都只能装在一个
  • java中html网页转化成pdf(itext)

    Java 实现 HTML 页面转 PDF 解决方案 一 添加 maven 依赖
  • Centos for arm64 aarch64 下载地址列表以及鲲鹏服务器安装教程

    鲲鹏服务器安装Centos 7 6教程 镜像下载地址 一 BIOS 配置 二 通过BMC界面的虚拟光驱安装 1 虚拟光驱挂载系统ISO镜像 2 设置启动项为光驱启动 3 重启服务器 三 下载驱动软件包和驱动配套表 1 驱动下载 2 驱动安装
  • LeetCode 523. Continuous Subarray Sum 解题报告

    LeetCode 523 Continuous Subarray Sum 解题报告 题目描述 Given a list of non negative numbers and a target integer k write a funct