博客
关于我
leetcode------523. 连续的子数组和[1]
阅读量:186 次
发布时间:2019-02-28

本文共 1653 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要判断给定数组中是否存在至少两个连续的子数组,其和为目标整数 k 的倍数。我们可以通过前缀和和模运算来高效地解决这个问题。

方法思路

  • 特殊情况处理:当目标整数 k 为 0 时,我们需要检查数组中是否存在连续的两个 0,因为只有这样,子数组的和才能为 0。
  • 前缀和和模运算:对于非零的 k,我们可以使用前缀和数组来记录每个位置的和,并使用模运算来记录每个前缀和对 k 取模的结果。这样,当我们发现两个前缀和对 k 取模后的结果相同时,说明它们之间的子数组和是 k 的倍数。
  • 解决代码

    #include 
    #include
    using namespace std;class Solution {public: bool checkSubarraySum(vector
    & nums, int k) { int n = nums.size(); if (n < 2) return false; // 子数组至少需要2个元素 if (k == 0) { // 检查是否存在连续的两个0 for (int i = 0; i < n - 1; ++i) { if (nums[i] == 0 && nums[i + 1] == 0) { return true; } } return false; } else { vector
    prefix(n + 1, 0); for (int i = 1; i <= n; ++i) { prefix[i] = prefix[i - 1] + nums[i - 1]; } unordered_map
    seen; seen[prefix[0] % k] = 0; for (int j = 1; j <= n; ++j) { int current_mod = prefix[j] % k; if (seen.find(current_mod) != seen.end()) { int i = seen[current_mod]; if (i <= j - 2) { return true; } } seen[current_mod] = j; } return false; } }};

    代码解释

  • 特殊情况处理:当 k 为 0 时,遍历数组检查是否有连续的两个 0。如果有,返回 true,否则返回 false。
  • 前缀和计算:计算前缀和数组 prefix,其中 prefix[i] 表示数组前 i 个元素的和。
  • 模运算记录:使用一个哈希表 seen 记录每个前缀和对 k 取模后的值及其对应的索引。当发现相同的模值时,检查索引是否满足子数组长度至少为 2 的条件,如果满足,返回 true。
  • 遍历检查:遍历前缀和数组,更新模值记录,直到找到符合条件的子数组或遍历结束。
  • 这种方法的时间复杂度为 O(n),适用于较大的数组长度。

    转载地址:http://vnki.baihongyu.com/

    你可能感兴趣的文章
    Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
    查看>>
    Position属性四个值:static、fixed、absolute和relative的区别和用法
    查看>>
    POSIX thread编程中关于临界区内条件变量的分析
    查看>>
    POSIX与程序可移植性
    查看>>
    posix多线程有感--自旋锁
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    POSIX标准和XSI扩展
    查看>>
    post install error,please remove node_moules before retry
    查看>>
    postcss-pxtorem 参数之selectorBlackList、exclude的用法
    查看>>
    Postek博思得标签打印机更换电脑,打印出来标签空白
    查看>>
    postfix+ dovecot搭建邮件服务器
    查看>>
    postfix在邮件服务器中的使用
    查看>>
    PostGIS 3.1.2软件安装详细教程(地图工具篇.8)
    查看>>
    PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    PostGIS在Windows上的下载与安装
    查看>>
    Qt开发——网络编程之UDP客户端
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    postgis求面积、交集等相关函数
    查看>>
    postgis相关函数
    查看>>