Leetcode 47 Permutations II

Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.

Input: nums = [1,1,2]
Output:
[[1,1,2],
 [1,2,1],
 [2,1,1]]
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
  • Soruda 46. soruya benzer şekilde bize sayılardan oluşan bir liste veriliyor.Bu listedeki sayıların permutasyonlarını bulmamız isteniyor. Ama listede aynı sayılardan bulunabilir.
  • Burada 46. sorudaki yolun aynısını izleyebiliriz ama tek bir farkla. 46. soruda visited listesine elimizdeki sayıları atıyor ve bu sayılar kullanıldı mı diye kontrol ediyorduk.Bu sefer visited listesine indeksleri atıp.Bu indeks daha önce ziyaret edildi mi diye kontrol edeceğiz.
  • Ayrıca benzer kombinasyonlar oluşma ihtimali olduğu için elimizdeki kombinasyon uzunluğu verilen sayıların liste uzunluğuna ulaştığında ayrıca bu kombinasyon daha önce sonuç listesine eklenmiş mi diye kontrol edeceğiz.
  • Aşağıdaki örnekte nums = [1,1,2] için program akışını takip edebilirsiniz.
  • ekle 0 1 {0} [1] -> yapılan işlem-indeks-indeksteki sayı-ziyaret edilmiş indeksler-elimizdeki kombinasyon
ekle 0 1 {0} [1]
devam 0 1 {0} [1]
ekle 1 2 {0, 1} [1, 2]
devam 0 1 {0, 1} [1, 2]
devam 1 2 {0, 1} [1, 2]
ekle 2 2 {0, 1, 2} [1, 2, 2]
buldu {0, 1, 2} [1, 2, 2]
çıkar 2 2 {0, 1} [1, 2]
çıkar 1 2 {0} [1]
ekle 2 2 {0, 2} [1, 2]
devam 0 1 {0, 2} [1, 2]
ekle 1 2 {0, 1, 2} [1, 2, 2]
devam 0 1 {0, 1, 2} [1, 2, 2]
devam 1 2 {0, 1, 2} [1, 2, 2]
devam 2 2 {0, 1, 2} [1, 2, 2]
çıkar 1 2 {0, 2} [1, 2]
devam 2 2 {0, 2} [1, 2]
çıkar 2 2 {0} [1]
çıkar 0 1 set() []
ekle 1 2 {1} [2]
ekle 0 1 {0, 1} [2, 1]
devam 0 1 {0, 1} [2, 1]
devam 1 2 {0, 1} [2, 1]
ekle 2 2 {0, 1, 2} [2, 1, 2]
buldu {0, 1, 2} [2, 1, 2]
çıkar 2 2 {0, 1} [2, 1]
çıkar 0 1 {1} [2]
devam 1 2 {1} [2]
ekle 2 2 {1, 2} [2, 2]
ekle 0 1 {0, 1, 2} [2, 2, 1]
buldu {0, 1, 2} [2, 2, 1]
çıkar 0 1 {1, 2} [2, 2]
devam 1 2 {1, 2} [2, 2]
devam 2 2 {1, 2} [2, 2]
çıkar 2 2 {1} [2]
çıkar 1 2 set() []
ekle 2 2 {2} [2]
ekle 0 1 {0, 2} [2, 1]
devam 0 1 {0, 2} [2, 1]
ekle 1 2 {0, 2, 1} [2, 1, 2]
devam 0 1 {0, 2, 1} [2, 1, 2]
devam 1 2 {0, 2, 1} [2, 1, 2]
devam 2 2 {0, 2, 1} [2, 1, 2]
çıkar 1 2 {0, 2} [2, 1]
devam 2 2 {0, 2} [2, 1]
çıkar 0 1 {2} [2]
ekle 1 2 {2, 1} [2, 2]
ekle 0 1 {0, 2, 1} [2, 2, 1]
devam 0 1 {0, 2, 1} [2, 2, 1]
devam 1 2 {0, 2, 1} [2, 2, 1]
devam 2 2 {0, 2, 1} [2, 2, 1]
çıkar 0 1 {2, 1} [2, 2]
devam 1 2 {2, 1} [2, 2]
devam 2 2 {2, 1} [2, 2]
çıkar 1 2 {2} [2]
devam 2 2 {2} [2]
çıkar 2 2 set() []
[[1, 2, 2], [2, 1, 2], [2, 2, 1]]
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        def helper(results, nums, combination, start, visited):
            if len(combination) == len(nums) and combination not in results:
                results.append(list(combination))
                return
        
        
            for i in range(len(nums)):
                if i in visited:
                    continue
            
                visited.add(i)
                combination.append(nums[i])
                helper(results, nums, combination, i + 1, visited)
                combination.pop()            
                visited.remove(i)
                
        results = []
        nums = sorted(nums)
        visited = set()
        helper(results, nums, [], 0, visited)
        
        return results