我这里有javascript实现时的问题,这里是想用递归的方法找到[1,2]的所有排列,我将probabilitys和probability都用var来声明,但是probabilitys在push操作时并没有达到预期,同时probability却正常工作:
```javascript
/**
* @param {number} batchSize
* @param {number[]} groups
* @return {number}
*/
var currentGroups;
var probabilitys = [];
var probability = [];
function assembly(groups){
let nextgroups;
if(groups.length==0){
// console.log(probability);// [1,2] [2,1]
probabilitys.push(probability);
console.log(probabilitys);// 在本地浏览器打开console显示[[]] , [[],[]] ; 在leetcode测试显示[[1,2]] ,
// [[2,1],[2,1]]
probability.pop();
return;
}
for(let item of groups){
probability.push(item);
nextgroups = groups;
nextgroups = nextgroups.filter(it => it!=item);
assembly(nextgroups)
}
probability.pop();
return;
}
var maxHappyGroups = function(batchSize, groups) {
currentGroups = groups;
probabilitys = []//清空上一次的
assembly(groups)
// console.log(probabilitys);// [[],[]]
};
```
引用 皆我百晓生 小程序回复内容作答:
问题出在数组push操作时,对数组的引用进行了添加,而不是添加其副本。这导致在后续修改probability数组时,之前已经push的内容也被修改了。
为了解决这个问题,可以在push操作时使用数组的slice方法来创建副本。修改代码如下:
/**
* @param {number} batchSize
* @param {number[]} groups
* @return {number}
*/
var currentGroups;
var probabilitys = [];
var probability = [];
function assembly(groups){
let nextGroups;
if(groups.length==0){
probabilitys.push(probability.slice()); // 利用slice创建副本
console.log(probabilitys);
probability.pop();
return;
}
for(let item of groups){
probability.push(item);
nextgroups = groups;
nextgroups = nextgroups.filter(it => it != item);
assembly(nextgroups);
}
probability.pop();
return;
}
var maxHappyGroups = function(batchSize, groups) {
currentGroups = groups;
probabilitys = [];
assembly(groups);
};
现在,对probability数组进行修改时,不会影响之前已经push到probabilitys中的内容。在console.log输出时,你会看到正确的结果。