Javascript 如何通过4sum中的测试用例
这里是我的代码来解决leetcode中的问题Javascript 如何通过4sum中的测试用例,javascript,algorithm,Javascript,Algorithm,这里是我的代码来解决leetcode中的问题 var fourSum = function(ns, tar) { ns.sort((a, b) => a-b); let res=[], out=false; for(let i=0; i<ns.length-3; i++) { if(ns[i] !== ns[i-1]) { out = threeSum(ns, i+1, tar-ns[i]);
var fourSum = function(ns, tar) {
ns.sort((a, b) => a-b);
let res=[], out=false;
for(let i=0; i<ns.length-3; i++) {
if(ns[i] !== ns[i-1]) {
out = threeSum(ns, i+1, tar-ns[i]);
for(let item of out) {
res.push([ns[i], ...item]);
}
}
}
return res;
};
var threeSum = function(ns, ind, tar) {
let res=[], out=false;
for(let i=ind; i<ns.length-2; i++) {
if(ns[i] !== ns[i-1]) {
out = twoSum(ns, i+1, tar-ns[i]);
for(let item of out) {
res.push([ns[i], ...item]);
}
}
}
return res;
}
var twoSum = function(ns, ind, tar) {
let set = new Set();
let res = [];
for(let i=ind; i<ns.length; i++) {
if(set.has(tar-ns[i])) {
res.push([tar-ns[i], ns[i]]);
while(ns[i] === ns[i+1]) i++;
} else {
set.add(ns[i]);
}
}
return res;
}
如果我删除IFN[I]!==ns[i-1]{它能够通过案例1,但在
case 2:
[-3,-2,-1,0,0,1,2,3]
0
为什么不直接使用4个for循环来解决这个问题呢?基本上,a、b、c和d各取4个循环。如果它们的总和达到目标值,则只需按递增顺序将它们添加到名为res的结果数组中
最后,您只需确保res只有唯一的值。为此,您可以查看将数组转换为字符串的方法,然后检查重复项并删除重复项
以下是我公认的解决方案:
var fourSum = function(nums, target) {
var res = [];
for(var a=0; a < nums.length; a++){
for(var b=a+1; b < nums.length; b++){
for(var c=b+1; c < nums.length; c++){
for(var d=c+1; d < nums.length; d++){
if(nums[a] + nums[b] + nums[c] + nums[d] == target){
res.push( [nums[a], nums[b], nums[c], nums[d]].sort() )
}
}
}
}
}
var res_set = new Set(res.map(JSON.stringify));
var res_uniq = Array.from(res_set).map(JSON.parse);
return res_uniq;
};
我再次检查了测试用例:[0,0,0,0],sum==0 如果i==0,当登陆到这个ifns[i]!==ns[i-1]{ 它变成ifns[0]!==ns[0-1]{ out=threeSumns,i+1,tar ns[i];能够执行 基本上,这意味着每个?总和中的第一个数字需要忽略 因此,我在3sum func中做了以下更改 ifi-1>=ind&&ns[i]==ns[i-1]继续 完整代码:
var fourSum = function(ns, tar) {
ns.sort((a, b) => a-b);
let res=[], out=false;
for(let i=0; i<ns.length-3; i++) {
// can get in
if(ns[i] !== ns[i-1]) {
out = threeSum(ns, i+1, tar-ns[i]);
// each set add ns[i], 4 # now
for(let item of out) {
res.push([ns[i], ...item]);
}
}
}
return res;
};
var threeSum = function(ns, ind, tar) {
let res=[], out=false;
for(let i=ind; i<ns.length-2; i++) {
if(i-1 >= ind && ns[i] === ns[i-1]) continue;
out = twoSum(ns, i+1, tar-ns[i]);
for(let item of out) {
res.push([ns[i], ...item]);
}
}
return res;
}
var twoSum = function(ns, ind, tar) {
let set = new Set();
let res = [];
for(let i=ind; i<ns.length; i++) {
if(set.has(tar-ns[i])) {
res.push([tar-ns[i], ns[i]]);
while(ns[i] === ns[i+1]) i++;
} else {
set.add(ns[i]);
}
}
return res;
}
查看这个可爱的博客寻求帮助。在遍历多层解决方案时尝试跟踪逻辑。我相信如果您记录您的方法,使用有意义的变量名等,您将更容易获得帮助。@analogman可以随意添加您的有效解决方案作为答案。我个人认为这是一个易于理解的解决方案。干得好
var fourSum = function(ns, tar) {
ns.sort((a, b) => a-b);
let res=[], out=false;
for(let i=0; i<ns.length-3; i++) {
// can get in
if(ns[i] !== ns[i-1]) {
out = threeSum(ns, i+1, tar-ns[i]);
// each set add ns[i], 4 # now
for(let item of out) {
res.push([ns[i], ...item]);
}
}
}
return res;
};
var threeSum = function(ns, ind, tar) {
let res=[], out=false;
for(let i=ind; i<ns.length-2; i++) {
if(i-1 >= ind && ns[i] === ns[i-1]) continue;
out = twoSum(ns, i+1, tar-ns[i]);
for(let item of out) {
res.push([ns[i], ...item]);
}
}
return res;
}
var twoSum = function(ns, ind, tar) {
let set = new Set();
let res = [];
for(let i=ind; i<ns.length; i++) {
if(set.has(tar-ns[i])) {
res.push([tar-ns[i], ns[i]]);
while(ns[i] === ns[i+1]) i++;
} else {
set.add(ns[i]);
}
}
return res;
}