LeetCode 128 · Longest Consecutive Sequence · Medium
Çözümün her adımını burada izleyebilirsin. Bir dizi seç, İleri'ye bas ya da Oynat'a tıkla; sadece grup başlarından saymanın, aynı grubu tekrar tekrar saymayı nasıl önlediğini gör.
HashSet, "bu sayı var mı?" sorusunu diziyi taramadan, anında cevaplar. Tekrar eden sayılar sete bir kez girer.
Bir sayının bir eksiği sette yoksa o sayı bir grubun başıdır. Başı olmayan sayıları atlıyoruz; böylece her grup bir kez sayılıyor.
Grup başından itibaren bir fazlası, onun bir fazlası… sette olduğu sürece uzunluğu artır. En uzun grubu longest'ta tut.
Virgülle ayrılmış en fazla 10 tam sayı yaz (örneğin 4, 1, 3, 2). Sayılar -999 ile 999 arasında olmalı. Boş bırakırsan dizi boş olur.
Set, sayı doğrusunda (küçükten büyüğe; "…" arada eksik sayı olduğunu gösterir)
Değişkenler
Kod (Solution.cs içindeki metot)
Kodda bir foreach ve içinde bir while var; ilk bakışta O(n²) gibi görünüyor. Ama while sadece grup başlarında çalışıyor ve her sayı en fazla bir grubun içinde sayılıyor. Toplamda her sayıya foreach'te bir kez, while'da en fazla bir kez bakılıyor: O(n) zaman. Set n sayı tuttuğu için O(n) bellek kullanıyor.
Grup başı kontrolü olmasaydı her sayıdan ileri doğru sayardık. 0'dan 99.999'a kadar bütün sayıların olduğu bir dizide 0'dan 100.000, 1'den 99.999 adım… toplam yaklaşık 5 milyar adım ederdi.
foreach'in nums yerine set üzerinde dönmesi de önemli. Bir grubun başı dizide çok kez tekrar ediyorsa (örneğin 50.000 tane 1), nums üzerinde dönmek aynı grubu 50.000 kez sayar. Set'te her sayı bir kez olduğu için bu sorun olmuyor.
Diziyi sıralayıp baştan sona yürümek de doğru sonuç verir ve kodu daha kısadır. Ama sıralama O(n log n) sürer ve metoda verilen diziyi değiştirir. Set'li çözüm daha hızlı ve girdiye dokunmuyor.