Continuous Subarray Sum

1.解析

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

2.分析

这道题本质上和Contiguous Array是一样的。只不过换了个条件,另外还要注意k = 0情况下的处理。也是要用到子数组和去求解,我想到的是,用一个二层循环,第一个循环标记当前子序列的起始位置,第二个循环是依次将该起始位置作为起始坐标,依次和后面的元素相加,然后判断,这种做法最坏的时间复杂度为O(n^{2}),不知道为何能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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值