Menyimpan yang terbaik sejauh ini

Dua counter dengan tugas berbeda: satu untuk yang sedang berjalan, satu untuk rekor yang pernah tercapai.

Sebaiknya baca lebih dulu: Memilih sebagian ke array baru, Mencari terkecil dan terbesar.

Dua angka di papan tulis

Menghitung deret terpanjang butuh keduanya. Satu counter mencatat panjang deret yang sedang berjalan, dan ia kembali ke satu setiap kali derutnya terputus. Satu lagi menyimpan panjang terpanjang yang pernah tercatat, dan ia tidak pernah turun.

IngatCounter yang sedang berjalan direset. Rekor tidak pernah direset, hanya dinaikkan bila terlampaui.

Kesalahan yang paling sering

Satu counter saja

SET panjang = 1
SET i = 1
WHILE i < LENGTH(items)
  IF items[i] == items[i - 1]
    SET panjang = panjang + 1
  ELSE
    SET panjang = 1
  END
  SET i = i + 1
END
OUTPUT panjang

Dua counter

SET panjang = 1
SET rekor = 1
SET i = 1
WHILE i < LENGTH(items)
  IF items[i] == items[i - 1]
    SET panjang = panjang + 1
  ELSE
    SET panjang = 1
  END
  IF panjang > rekor
    SET rekor = panjang
  END
  SET i = i + 1
END
OUTPUT rekor

Pada [1, 1, 2, 2, 2, 3] kolom kiri menjawab satu, sebab deret terakhirnya hanya berisi angka tiga dan counternya sudah direset. Deret sepanjang tiga yang ditemukan di tengah hilang tanpa jejak. Kolom kiri hanya benar bila deret terpanjangnya kebetulan berada di ujung array, dan itu kebetulan yang tidak boleh diandalkan.

Perhatikan bahwa kolom kanan memeriksa rekornya di luar kedua cabang, bukan di dalam cabang penambahan. Menaruhnya di dalam cabang penambahan juga bekerja untuk kasus ini, tetapi ia berhenti bekerja pada deret sepanjang satu di awal array, dan memeriksanya selalu jauh lebih mudah dijelaskan daripada memeriksanya kadang kadang.

Melihat rekor bertahan

SET panjang = 1
SET rekor = 1
SET i = 1
WHILE i < LENGTH(items)
  IF items[i] == items[i - 1]
    SET panjang = panjang + 1
  ELSE
    SET panjang = 1
  END
  IF panjang > rekor
    SET rekor = panjang
  END
  SET i = i + 1
END
panjang1
rekor1
i1

Keduanya dimulai dari satu, sebab elemen pertama sendiri sudah membentuk deret sepanjang satu.

Langkah 1 dari 8
items berisi [1, 1, 2, 2, 2, 3]. Perhatikan panjang direset dua kali sedangkan rekor tidak pernah turun.

Nilai awal, dan array kosong

Nilai awal keduanya satu, bukan nol, dan itu bukan kebetulan. Satu elemen sudah membentuk deret sepanjang satu, jadi array apa pun yang punya minimal satu elemen jawabannya minimal satu.

  • Array yang seluruh elemennya berbeda, misalnya [1, 2, 3, 4, 5, 6], menjawab satu. Bukan nol: setiap elemen adalah deret sepanjang satu.
  • Array berisi satu elemen menjawab satu, dan loopnya tidak berjalan sekali pun sebab penelusuran dimulai dari indeks satu.
  • Array yang seluruh elemennya sama menjawab panjang arraynya sendiri.
  • Array kosong menjawab nol, dan ini satu satunya kasus yang menuntut penjaga tersendiri sebab nilai awal satu akan salah di sini.

Butir terakhir pantas diperhatikan. Nilai awal satu benar untuk seluruh array berisi apa pun, dan salah tepat untuk array kosong. Ini kebalikan dari pola yang biasa: biasanya nilai awal yang netral menangani kasus kosong dengan sendirinya, sedangkan di sini nilai awal yang benar untuk kasus umum justru menuntut kasus kosong ditolak lebih dulu dengan klausa penjaga.

Periksa pemahaman

items berisi [9, 9, 9, 9]. Berapa kali counter panjang direset, dan apa jawabannya?

Ringkasan

  • Pola menyimpan yang terbaik sejauh ini butuh dua counter dengan tugas berbeda.
  • Yang sedang berjalan direset; rekor tidak pernah turun.
  • Satu counter saja hanya benar bila jawabannya kebetulan berada di ujung array.
  • Periksa rekornya di luar kedua cabang, bukan di dalam cabang penambahan.
  • Nilai awal satu, sebab satu elemen sudah membentuk deret sepanjang satu.
  • Array kosong adalah satu satunya kasus yang menuntut penjaga tersendiri di sini.