buyoh.hateblo.jp

残念な競技プログラミング参加者による学習記録

LeetCode - Subarrays with K Different Integers

解けなかった

問題

leetcode.com

K種類の整数から構成される連続部分配列をgoodと呼ぶ.

入力から与えられる配列の連続部分配列のうち,goodな配列はいくつ存在するか?

重要な考察

K種類以下の整数から構成される連続部分配列なら容易に数え上げられる

解法

K種類以下の整数から構成される連続部分配列

しゃくとり法.区間がK種類以下の整数から構成されるようにしゃくとる. 右端を進める時に,バケツに右端の整数を入れ, バケツの中の整数がK種類を超えるならば,左端を進めて,左端の整数をバケツから取り出す.

しゃくとり中の区間の右端をiとしたとき,「右端をiとする,K種類から構成される連続部分配列の個数」は 「しゃくとりの区間の長さ」と等価. よって,全てのiについて,しゃくとりの区間の長さの総和を取る.

K種類の整数から構成される連続部分配列

K種類以下の整数から構成される連続部分配列の個数をans(K)とする.

ans(K) がわかっているので, ans(K)-ans(K-1) して解を得る.

提出

atcodercodeforcesとは異なる形式なのでrepを貼り付けにくく厳しい.

leetcode.com

N = 2*104 なので,int32_tでもオーバーフローしない.

K種類の整数から構成される連続部分配列を直接求める方法もあるような気はするが,場合分けが厳しい