れんぞくぶんすうれつ


質問する



マイコード

let N = 8;
let M = 6;
let arr = [1,2,1,3,1,1,1,2];
----------------------------------
let p1=0;
let p2=1;
let sum = arr[p1] + arr[p2];
let cnt = 0;
while(p1<N && p2<N){
    if(sum < M){
        sum += arr[p2+1];
        p2++;        
    } 
    else if(sum === M){
        cnt++;
        sum -= arr[p1];
        p1++
        sum += arr[p2+1];
        p2++     
    }
    else{
        sum -= arr[p1];
        p1++;
    } 
}
console.log(cnt);

n/a原理

  • は、ポインタ(p 1、p 2)をarr[0]、arr[1]、sum=arr[0]+arr[1]にそれぞれ初期化する.
  • sum
  • sum==Mの場合、p 1、p 2はいずれも右に移動する.
  • sum>Mはp 1を右側に移動します.
  • 別の解釈

    let n = 8;
    let m = 6;
    let arr = [1,2,1,3,1,1,1,2];
    ----------------------------------
    let answer=0, lt=0, sum=0;
    for(let rt=0; rt<arr.length; rt++){
      sum+=arr[rt];
      if(sum===m) answer++;
      while(sum>=m){
        sum-=arr[lt++]; //[lt++]는 sum-=arr[lt]를 한 후 lt++를 해준다는 뜻이다.
        if(sum===m) answer++;       
      }
    }
    console.log(answer);

    n/a原理

  • rtは右に移動し続けます.
  • ltはsum>=mでのみ移動します.
    「>=」と言うのはsum==mならltも移動するからです.