Kadane algoritması nedir? Maksimum toplamlı alt diziyi (Maximum Subarray) bulun.

Cevap

Kadane algoritması, her indekste o indekste biten en iyi alt dizi toplamını tutar: ya önceki alt diziye eklenir ya da yeni bir alt dizi başlatılır. O(n) zaman ve O(1) bellekte çalışır.

cur = max(x, cur + x): önceki toplam negatifse onu taşımak zarar verir, sıfırdan başlamak daha iyidir.

def max_subarray(nums):
    best = cur = nums[0]
    for x in nums[1:]:
        cur = max(x, cur + x)
        best = max(best, cur)
    return best

print(max_subarray([-2, 1, -3, 4, -1, 2, 1, -5, 4]))  # 6  -> [4, -1, 2, 1]
print(max_subarray([-3, -1, -2]))                     # -1 (tümü negatif)

Adım adım

xcurbest
-2-2-2
111
-3-21
444
-134
255
166

Tuzaklar

  • best = 0 ile başlamak, tüm elemanlar negatifken yanlış sonuç (0) verir. İlk elemanla başlayın.
  • Alt dizinin başlangıç ve bitiş indeksi istenirse cur sıfırlandığında geçici başlangıcı kaydedin.

Neden bir DP?

dp[i] = max(nums[i], dp[i-1] + nums[i]) geçişidir; yalnızca bir önceki değer kullanıldığı için dizi yerine tek değişken yeterlidir.

İlgili sorular: Maximum Product Subarray (hem min hem max tutulur, çünkü negatif x negatif pozitiftir), Best Time to Buy and Sell Stock.

  1. Binary search'ün zaman karmaşıklığı nedir ve neden?KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  2. Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  3. Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  4. Tek yönlü bağlı listeyi ters çevirin.OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  5. BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  6. get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.ZorAlgoritmalar & Veri YapılarıYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle