博客
关于我
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/

    你可能感兴趣的文章
    OfficeWeb365 Readfile 任意文件读取漏洞复现
    查看>>
    OfficeWeb365 SaveDraw 文件上传漏洞复现
    查看>>
    office中的所有content type
    查看>>
    office之Excel 你会用 Ctrl + E 吗?
    查看>>
    Office办公软件里的“开发工具”选项卡-ChatGPT4o作答
    查看>>
    Offline Installation the .NET Framework 3.5 on Windows 8
    查看>>
    OGG初始化之使用数据库实用程序加载数据
    查看>>
    ogg参数解析
    查看>>
    ognl详解
    查看>>
    Ogre 插件系统
    查看>>
    Oil Deposits
    查看>>
    oj2894(贝尔曼福特模板)
    查看>>
    OJ4TH|Let's play a game
    查看>>
    OJ中处理超大数据的方法
    查看>>
    OJ中常见的一种presentation error解决方法
    查看>>
    OK335xS UART device registe hacking
    查看>>
    ok6410内存初始化
    查看>>
    OkDeepLink 使用教程
    查看>>
    OKHTTP
    查看>>
    Okhttp3添加拦截器后,报错,java.io.IOException: unexpected end of stream on okhttp3.Address
    查看>>