Um problema de permutações (LeetCode), que encontra as permutações de um array [1,2,3], retorna um array vazio por meio de uma função recursiva de retrocesso. O console imprime o seguinte:
Input
nums =
[1,2,3]
Stdout
[ [ 1, 2, 3 ] ]
[ [ 1, 3, 2 ] ]
[ [ 2, 1, 3 ] ]
[ [ 2, 3, 1 ] ]
[ [ 3, 1, 2 ] ]
[ [ 3, 2, 1 ] ]
Output
[[]]
Esta seria a solução adequada se o array não parecesse ser reinstanciado em cada chamada recursiva.
Aqui está o código:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
let s = [], a = [];
return findPerm(nums, s, a);
};
var findPerm = function(nums, stack, ans){
if(nums.length === stack.length){
if(ans.indexOf(stack) === -1)
ans.push(stack);
console.log(ans);
}
for(let num of nums){
if(stack.indexOf(num) === -1){
stack.push(num);
findPerm(nums, stack, ans);
stack.pop();
}
}
return ans;
};
permute([1,2,3]);
Por que estou recebendo um array vazio?
Isso acontece porque você está enviando
stack
paraans
, mas também modificando a mesmastack
referência de array posteriormente comstack.pop()
, fazendo com que o array enviado pareça vazio. Uma maneira de corrigir isso seria fazer uma cópia dostack
array ao enviá-lo paraans
:agora, quando você
.pop()
, ele não modificará mais esta nova referência de array.