LeetCode 238 · Product of Array Except Self · Medium

Kendisi Hariç Çarpım

Çözümün her adımını burada izleyebilirsin. Bir dizi seç, İleri'ye bas ya da Oynat'a tıkla; her kutunun cevabının solundaki ve sağındaki sayıların çarpımından nasıl oluştuğunu gör.

Video anlatım

3,5 dakikalık Türkçe anlatım: soru, "sol × sağ" fikri ve iki yürüyüş. Seslendirme: ElevenLabs.

Fikir üç adımda

  1. 1

    Kendisi hariç = sol × sağ

    Bir sayıyı kapatınca kalanlar ikiye ayrılır: solundakiler ve sağındakiler. Cevap, bu iki grubun çarpımlarının çarpımıdır.

  2. 2

    Sol çarpımları answer'a yaz

    Soldan sağa giderken her kutuya, bir önceki kutunun değeri × bir önceki sayı yazılır. Solunda sayı olmayan ilk kutuya 1 yazılır.

  3. 3

    Sağı tek değişkende biriktir

    Sağdan sola dönerken right, geçtiğimiz sayıların çarpımını tutar. answer[i]'yi right ile çarpınca o kutunun cevabı tamamlanır.

Adım adım izle

Diziler (üstte girdi, altta cevap; aynı sütun aynı kutu)

solundakiler / answer'daki sol çarpım sağındakiler (right) kapatılan sayı (kendisi) cevabı tamamlandı

Değişkenler

i'nin solundakiler
i'nin sağındakiler

Kod (Solution.cs içindeki metot)

Neden O(1) ekstra bellek?

Diziyi bir kez soldan sağa, bir kez sağdan sola geziyoruz: O(n) zaman.

Daha kolay bir çözümde "sol" ve "sağ" çarpımları left ve right adlı iki ayrı dizide tutulur ve sonra kutu kutu çarpılır. O da O(n) zamanda çalışır ama n'er elemanlık iki dizi açtığı için O(n) bellek kullanır. Burada sol çarpımları doğrudan answer'a yazıyoruz; sağ çarpımları ise hiç saklamıyoruz, sağdan sola giderken tek bir right değişkeninde biriktiriyoruz. answer zaten döndürülecek dizi olduğu için hesaba katılmıyor; fazladan sadece n, i ve right var: O(1) ekstra bellek.

Hepsini çarpıp nums[i]'ye bölmek soruda yasak; dizide 0 varsa da 0'a bölünemeyeceği için çalışmaz. Sol × sağ yöntemi hiç bölme yapmaz, 0'lar da kendiliğinden doğru sonucu verir.