LeetCode 238 · Product of Array Except Self · Medium
Çö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.
3,5 dakikalık Türkçe anlatım: soru, "sol × sağ" fikri ve iki yürüyüş. Seslendirme: ElevenLabs.
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.
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.
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.
Virgülle ayrılmış en az 2, en fazla 8 tam sayı yaz. Sayılar -30 ile 30 arasında olmalı.
Diziler (üstte girdi, altta cevap; aynı sütun aynı kutu)
Değişkenler
Kod (Solution.cs içindeki metot)
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.