top of page
  • Yazarın fotoğrafıberilcankutlu

LeetCode Two Sum Soru Çözümü



LeetCode programlama, algoritma ve veri yapıları öğrenmek için kullanılan bir çevrimiçi platformdur. LeetCode çeşitli programlama soruları ile kod yazma becerilerinizi geliştirmenize yardımcı olur.



İlk soru olan "Two Sum" sorusu ile başlıyoruz.

Bir tamsayı dizisi ve bir tamsayı hedefi verildiğinde, iki sayının dizinlerini, toplamları hedefe ulaşacak şekilde döndürün. Her girdinin tam olarak bir çözümü olacağını varsayabilir ve aynı öğeyi iki kez kullanamazsınız. Cevabı istediğiniz sırayla geri gönderebilirsiniz.

Yani elimizde "nums" adlı bir liste olduğunu düşünelim ve bir "target" değeri verilsin. Soruda "nums" listesi içindeki iki değer toplandığında "target" değerine ulaşacak, toplanan liste elemanlarının indexlerini döndürecek bir kod yazılması isteniyor.

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Yukarıdaki örnekte "nums" listesi 2,7,11,15 değerlerinden oluşmakta ve "target" değeri 9 olarak belirlenmiş. Yazılacak kodun listeyi tarayıp 2 ve 7 değerini bulacak ve bu değerlerin indexlerini ekrana yazdıracak.


Şimdi LeetCode'un çözümde gösterdiği kod satırlarını inceleyelim.

class Solution:
  def twoSum(self, nums: List[int], target: int) -> List[int]:

"Solution" adlı bir class oluşturulmuş ve içine "twoSum" adlı bir fonksiyon tanımlamaya başlanmış. Bu fonksiyonun parametrelerini teker teker inceleyelim.

  • "self"ifadesi Python'da bir sınıfın instance'ını yani örneğini temsil eden bir referanstır. Sınıfın yöntemleri ve özellikleri için kullanımı yaygındır. Yani buradaki "self" ifadesi, "Solution" sınıfının bir örneğini temsil eder ve "twoSum" fonksiyonunun sınıfın bir yöntemi olduğunu, bu yönteminde o sınıfa ait olduğunu belirtir. Örneğin;

class MyClass:
	def myFunc(self):
		........

şeklinde bir fonksiyonumuz olsun.

myinstance = MyClass()
result = myinstance.myFunc()

"myFunc" fonksiyonu, "myinstance" adlı "MyClass" örneği üzerinden çağrılarak çalıştırılır. Bu durumda "self" ifadesi "myinstance" örneğini temsil eder.

  • "nums: List[int]" ifadesi bir fonksiyon parametresinin tipini belirler. Yani "nums" parametresinin tamsayılardan oluşan bir liste olduğunu belirtir.

  • "target: int" ifadesi de bir fonksiyon parametresinin tipini belirler. Yani "target" parametresinin bir tamsayı olduğunu belirtir.

  • "-> List[int]" ifadesi fonksiyonun dönüş değerinin tipini belirtmektedir. Yani, "twoSum" fonksiyonu tamsayılardan oluşan bir liste döndürmelidir.

Çözüme geçelim.

class Solution:
  def twoSum(self, nums: List[int], target: int) -> List[int]:

    values_dict = {}

    for index, value in enumerate(nums):
      required = target - value

      if required in values_dict:
        return [index, values_dict[required]]

      else:
        values_dict[value] = index 

"enumerate()" fonksiyonu hem elemanın değerini hem de indexini döndürür. Yani bir tuple döndürür. Bu tuple'ın ilki index, ikincisi elemanın kendisidir.

Kabaca bu kodun işleyişini adım adım açıklayalım:

  • "values_dict" adlı boş bir sözlük oluşturduk. Bu sözlükte görülen sayılar ve indexleri tutulacaktır.

  • "enumerate(nums)" ifadesini bir döngüde kullanarak "nums" listesindeki her bir sayının indexi ve değeri alınır.

  • Her döngü adımında "required" değişkenine "target - value" ataması yapılır.

  • "required" değerinin karşılığı sözlükte var mı diye "if" ile kontrol edilir. Eğer var ise "index" ve "values_dict[required]" ifadeleri döndürülür. Bu adımda "target" değerini elde etmek için gerekli olan iki sayının index'ini döndürü

  • Eğer "required" sözlükte yoksa, "value" ve "index" değerlerini sözlüğe ekler. Böylece bu sayıya ihtiyaç duyulması halinde indexine hızlıca erişilebilir.

Kodu çalıştırmak için örnek bir "nums" ve "target" değerleri verelim.

   nums = [2, 7, 11, 15] 
   target = 9  
   solution = Solution() 
   result = solution.twoSum(nums, target) 
   print(result)

Çıktıyı da hızlıca anlatalım.

  • Döngünün ilk adımında "enumerate(nums)" ile ilk "nums" değerini "index" ve "value" olarak ayırdık."index" değeri 0, "value" değeri 2 oldu.

  • "target" değerinden "value" değerini çıkardık. "target" değeri 9, "value" değeri 2, yani, 9-2=7 değerini "required" değerine atadık.

  • "values_dict" adlı sözlükte "required" değeri var mı diye if'li bir komut yazdık. Fakat sözlük şu anda boş olduğu için "else" satırına geçtik.

  • Buradaki "values_dict[value] = index" komutu ile "value" anahtarlı bir "index" değeri ekledik. Anahtar değeri 0, anahtara karşılık gelen değer ise 2 oldu. Artık sözlükte bir değer var.

  • İkinci döngüye geçtik, "enumerate(nums)" ile artık ikinci "nums" değerini "index" ve "value" olarak ayırdık."index" değeri 1, "value" değeri 7 oldu.

  • "target" değerinden "value" değerini çıkardık. "target" değeri 9, "value" değeri 7, yani, 9-7=2 değerini "required" değerine atadık.

  • "values_dict" adlı sözlükte "required" değeri var mı diye if'li bir komut yazdık. Aranan 2 değeri sözlükte var, bu sebeple anahtarı ve değeri döndürdük. Anahtar 0, değeri 2 idi.

Böylece çıktımız [0,1] oldu.

bottom of page