Leetcode 448 Find All Numbers Disappeared in an Array

Follow up: Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.


Input: nums = [1, 3, 4, 3]
Output: [2]


Input: nums = [1,1]
Output: [2]

  • 1’den n’e kadar olan sayıları içeren bir set liste oluştururuz.
  • Örneğin [1,4] için [1,2,3,4] oluşur.Daha sonra verilen listeyi dolaşırız.
  • Listenin içerdiği her sayıyı elimizdeki set listeden çıkarırız.Kalan ilk listede bulunmayan sayı olur.
  • Elimizdeki listeyi dolaşırız.Ve oradaki her değer için değer-1 indexi negatif yaparız.Daha sonra elimizdeki listeyi tekrar dolaştığımızda pozitif kalanların indexlerinin 1 fazlası listede olmayan değerleri verir.Yeni bir liste oluşturulmadığı için Space complexity : O(1).
 |
​[1, 3, 4, 3]	1-1 = 0 -> 0. indexi -yap
     |
​[-1, 3, 4, 3]	3-1 = 2 -> 2. indexi -yap
         |
​[-1, 3, -4, 3]	4-1 = 3 -> 3. indexi -yap
             |
​[-1, 3, -4, -3]3-1 = 2 -> 2. indexi -yap zaten -

​[-1, 3, -4, -3] pozitif olan  sadece 1. index 1+1 = 2 listedeki eksik sayı
def find_disappeared_numbers_in_array(nums):
    length_nums = len(nums)
    all_numbers_set = set(range(1, length_nums + 1))

    for num in nums:
        if num in all_numbers_set:
            all_numbers_set.remove(num)

    return list(all_numbers_set)
class Solution:
    def findDisappearedNumbers(self, nums):
        for i in range(len(nums)):            
            index = abs(nums[i]) - 1    # be aware to use absoluate value!!!  the ith element may be negative 
            if nums[index] > 0:
                nums[index] = -nums[index]
        anw = list()
        for i in range(len(nums)):
            if nums[i] > 0:
                anw.append(i+1)
        return anw