@duong-lt

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

最大連続true値カウントしたい

Q&A

Closed

解決したいこと

最大連続true値カウントしたい

例)

$array = [
   0 => false, 
   1 => true, 
   2 => true, 
   3 => false,
   4 => true,
   5 => true,
   6 => true,
   7 => true,
   8 => true,
   9 => false
]

1と2はtrue連続、4~8true連続

4~8のtrueだけをカウントしたい。(期待値:5)

いいアイデアがある方いらっしゃいますしたら、教えてくださいますようよろしくお願いします。

0 likes

1Answer

連続であるかどうかを見る変数cntを用意して,以下のように実装することが可能です.

$ans = 0;
$cnt = 0;
foreach ($array as $arr) {
    if ($arr) {
        $cnt++;
    } else {
        $cnt = 0;
    }
    $ans = max($ans, $cnt);
}
echo $ans

またはif文の中を三項演算子を用いて簡潔にして

$ans = 0;
$cnt = 0;
foreach ($array as $arr) {
    $cnt = ($arr ? $cnt + 1 : 0);
    $ans = max($ans, $cnt);
}
echo $ans

にしても良いと思います.

おまけ

もう少しこの問題を発展/拡張させると,ランレングス(Run Length)という情報を取得した上で,trueの最大のランレングスを取得したい.と言い換えることができます.

先述の$arrayを例にとってランレングスを求めると,
falseが1つ,trueが2つ,falseが1つ,trueが5つ,falseが1つ
となります.

ただの$array
[false, true, true, false, true, true, true, true, true, false]
ランレングス圧縮後
[[false, 1], [true, 2], [false, 1], [true, 5], [false, 1]]

このような情報を取得するアルゴリズムの名前をランレングス圧縮と言いますので,ぜひ調べてみたら良いと思います.

1Like

Comments

  1. @duong-lt

    Questioner

    ご丁寧ご回答ありがとうございます。
    大変助かりました。

Your answer might help someone💌