题目如下:
解题思路:
如果用一个四层for循环进行暴力求解肯定是能得到结果的,但是这样的话复杂度就是O(n^4)。有没有办法把复杂度降到O(n^2)呢,答案是有的。题目要求的是四个数相加,那么我们可以利用分治的思想拆分成两个数的和与另外两个数的和相加即可,只要保证这里的两组两个数在数组中对应的下标不重复即可,这样就把复杂度降下来了。
代码如下:/**
* @param {number[]} nums * @param {number} target * @return {number[][]} */ var fourSum = function(nums, target) { var res = new Array() var inx = new Array(nums.length);
for(var i = 0;i < inx.length; i++){ inx[i] = new Array(nums.length); }
//val 记录任意两个数的和,以及这两个数分别对应的下标 var val = new Array() for(var i = 0;i < nums.length;i++){ for(var j = i+1;j < nums.length;j++){ var obj = new Object() obj.v = nums[i] + nums[j] obj.x = i obj.y = j val.push(obj) inx[i][j] = val.length - 1 //val保存的是一个映射,快速定位在val中的位置 } } //[1,3] -> [2,4] , n = 5 for(var i = 0;i< val.length;i++){ var node = val[i] if (node.y + 2 >= nums.length){ continue } for(var j = inx[node.y + 1][node.y + 2];j<val.length;j++){ if (val[i].v + val[j].v == target){ var ts = [nums[val[i].x],nums[val[i].y],nums[val[j].x],nums[val[j].y]].sort().join() if (res.indexOf(ts) == -1) res.push([nums[val[i].x],nums[val[i].y],nums[val[j].x],nums[val[j].y]].sort().join()) } } } for(var i = 0;i < res.length;i++){ res[i] = res[i].split(',').map(function(v){ return parseInt(v) }) } return res };