白駿2003ツリーの和2(Java、Java)


今回解決した問題.
白俊2003号の和2です.

📕 提问链接


❗¥コード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int [] map;
    static int N,M;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new int[N];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; ++i) map[i] = Integer.parseInt(st.nextToken());

        int res = 0;
        int e = 0;
        int sum = map[0];
        for(int s = 0; s < N; ++s)
        {
            while(e < N && sum < M)
            {
                e++;
                if(e != N) sum += map[e];
            }
            if(e == N) break;
            if(sum == M) res++;
            sum -= map[s];
        }
        System.out.print(res);
    }

}

📝 に答える


N個の数列からなる数列のうち連続部分数列の和がMであれば、問題は個数を求めることである.
この問題は、ゼロインデックスからダブルポインタを使用すると簡単に解決できます.
現在蓄積されているローカル数列の合計がM値未満の場合、end値を上げてローカル数列の範囲を拡大できます.M以上の場合、startを上げることで範囲を縮小できます.この過程で、現在の部分数列の和がM値と一致する場合、結果カウント値を1に増やし、startポインタを上げて次の部分数列を参照し続けることができます.

📜 ポスト


今日はタイプ中心に2 pointerを勉強しました.インデックスがエラーや場合によってはアップルの値が正しくないため、注意深くチェックする必要があるタイプです.