Проблема:

Учитывая набор чисел nums, который может содержать дубликаты, вернуть все возможные уникальные перестановки в любом порядке.

Пример 1:

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

Пример 2:

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

Ограничения:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

Решение:

Для такого рода задач нам нужно использовать поиск с возвратом. Мы также реализуем логический массив той же длины, что и массив чисел, чтобы отслеживать посещенные элементы (поскольку массив чисел содержит дубликаты):

var permuteUnique = function(nums) {
let results = []
nums.sort((a,b) => ab)
function backtrack(nums,results, temp,used){
if(temp.length == nums.length){
results.push([…temp])
}
for(let i = 0; i ‹ nums.length ; i++){
// console.log(used + " "+ i + " " + temp)
if(used[i] || (i › 0 && nums[i] == nums [i-1] && used[i — 1]) ){continue}
used[i] = true
temp.push(nums[i])
backtrack(nums,results, temp, used)
used[i] = false
temp.pop()
}
}
backtrack(nums,results, new Array(), new Array (nums.length).fill(false))
вернуть результаты
};