欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Continuous Subarray Sum

程序员文章站 2022-04-25 09:52:51
...

Continuous Subarray Sum

1.解析

题目大意,判断是否存在长度至少为2,和是k整数倍的连续子序列。

2.分析

这道题本质上和Contiguous Array是一样的。只不过换了个条件,另外还要注意k = 0情况下的处理。也是要用到子数组和去求解,我想到的是,用一个二层循环,第一个循环标记当前子序列的起始位置,第二个循环是依次将该起始位置作为起始坐标,依次和后面的元素相加,然后判断,这种做法最坏的时间复杂度为O(Continuous Subarray Sum),不知道为何能OJ;比较巧妙的是,利用Contiguous Array这题的思路,还涉及一个知识点:a % b = c, d % b = c,则(a-d)能整除b;所以,利用这条性质,我们可以用hashtable保存子数组和除以k的余数,如果当前余数出现过,则说明在a和d序列中间存在一段能整除k的子序列。但还有处理以下两种情况:

①k = 0, 则保存子序列和,而不保存子序列和除以k的余数。

②子序列长度至少为2,保存上一个子序列除以k的余数,而不是当前子序列的余数,例如 {23, 6}  k = 6,如果保存当前余数,则长度会小于2

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k){
        unordered_set<int> rem;
        int n = nums.size(), pre = 0, sum = 0;
        for (auto num : nums){
            sum += num;
            int t = k == 0 ? sum : sum % k; //k为0,则保存当前子序列的和
            if (rem.count(t)) return true; //当前余数出现过,则存在满足条件的子序列
            rem.insert(pre); //保存上一个子序列
            pre = t;
        }
        
        return false;
    }

};

[1]https://www.cnblogs.com/grandyang/p/6504158.html

相关标签: # 子序列