letcode 523. 连续的子数组和【前缀和and同余】

以下是lecode的一道题,可以用前缀和+同余的思想进行解题
请添加图片描述

1. 什么是前缀和

前缀和顾名思义就是一个求和运算,前多少项的和,我们用Sn表示就是 Sn = a0+a1+ …+an,现在有一个数列 11,2,8,6,9,7 那么它的前缀和数列就是,S1=11, S2=11+2=S1+2=13, S3=11+2+8=S2+8=21, S4=11+2+8+6=S3+6=27, S5=11+2+8+6+9=S4+9=36, S6=11+2+8+6+9+7=S5+7=43 。

1.1 前缀和应用

求区间和,最常被用作求某一个区间的和:Sj - Si

2. 什么是同余

若两个整数除以同一个整数得到的余数相同,就称这两个整数同余,X mod K = Y mod K;X,Y同余。

3.解题

“连续的子数组和”这道题就是 对区间和进行取模,余数为0则返回true;可以用前缀和表示就是:( Sj - Si)% k =0 ,由此公式我们可以推导出同余表达式 Sj % k = Si % k;于是这道题就转换为了前缀和取模,若能找到这两个前缀和同余则返回true(ps:题目还有其他细节条件,例如子数组大小最小为2,即区间大小最小为2【j - i > 1】;前缀和取模为0 就是直接条件称成立也是返回true)

var checkSubarraySum = function(nums, k) {
    let sum = 0;
    let resArr = [];
    for(let j=0; j<nums.length;j++){
    	//前缀和
        sum += nums[j];
        let R = sum % k;
        //查找前缀和的余数在数组中出现的下标位置既i的位置
        let i= resArr.indexOf(R);
        if( (i>=0 && (j-i)>1) || (R==0 && j>=1)){
            return true;
        }
        //将余数存起来
        resArr[j] = R;
    }
    return false;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值