动态规划——523. 连续的子数组和

本文介绍了一个中等难度的算法问题解决方案,通过使用哈希映射优化时间复杂度至O(n),判断给定数组是否存在连续子数组,其和为给定整数k的倍数。特别讨论了k为0的情况。

难度:中等

题目

给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。

示例 1:

输入: [23,2,4,6,7], k = 6
输出: True
解释: [2,4] 是一个大小为 2 的子数组,并且和为 6。
示例 2:

输入: [23,2,6,4,7], k = 6
输出: True
解释: [23,2,6,4,7]是大小为 5 的子数组,并且和为 42。
说明:

数组的长度不会超过10,000。
你可以认为所有数字总和在 32 位有符号整数范围内。

解答

思路

当k=0时,如果有连续两个0,则返回true。当k!=0时,从前到后累加如果取余为0,且不是只有一个数,则返回true;如果前后取余一样,则说明中间这一段取余是0,需要保证子数组个数大于2.
复杂度O
时间复杂度O(n)
空间复杂度O(n)

代码

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        // hashmap
        
        bool last_zero=false;
        if(k==0){
            for(auto it:nums){
                if(last_zero==true){
                    if(it==0){
                        return true;
                    }
                    last_zero=false;
                }
                else{
                    if(it==0){
                        last_zero=true;
                    }
                }
            }
            return false;
        }
        int sum=0;
        unordered_map<int,int> my_map;
        for(int i=0;i<nums.size();i++){
            sum=(sum+nums[i])%k;
            if(sum==0&&i!=0){
                return true;
            }
            
            if(my_map[sum]==0){
                my_map[sum]=i+1;
            }
            else{
                if(i-my_map[sum]>0){
                    return true;
                }         
            }
        }
        return false;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值