当前位置: 代码迷 >> 综合 >> leetcode-15-3sum
  详细解决方案

leetcode-15-3sum

热度:6   发布时间:2023-12-24 17:48:27.0

1.说明

    题目是,给定一个数组(nums),返回一个数组(假定为result),result的每个元素都是一个数组(假定为ele),ele长度为3,其中的3个元素不重复地取自nums,并且这3个元素之和为0。result中的各数组要保证3元素组合不重复。

    首先最容易想到的方法是暴力遍历,用一个3重循环求取结果,再去重即可。这样复杂度为n^3。

    可以从多个角度进行优化

    第一,先把输入参数nums升序排序,这样可以在遍历的过程中判断两数之和是否大于0,如果大于0可以不用再向后遍历,这就减少了一定的计算量;

    第二,可以给nums去重,保证每个元素最多只有3个重复;

    第三,可以先把nums中每个元素存到一个hash里,key就是这个元素的值,value是这个元素最后出现的下标,遍历的时候,只需要两重遍历即可;

2.代码

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {var resultHash = {};var numsHash = {};var result = [];var newNums = [];var newNumsHash = {};// nums去重nums.forEach(function (item, index) {if (newNumsHash[item] !== 3) {newNums.push(item);if (newNumsHash[item]) {newNumsHash[item]++;}else {newNumsHash[item] = 1;}}});// 排序var list = newNums.sort(function (a, b) {return a - b;});// 将nums转成hashfor (var i = 0; i < list.length; i++) {numsHash[list[i]] = i + 1;}// 两重遍历确定两个数,第三个数在numsHash里找for (var j = 0; j < list.length; j++) {for (var k = j + 1; k < list.length; k++) {var target = -(list[j] + list[k]);// 因为数组是升序排好序的,所以如果两数之和大于0,再加上后面的肯定不为0if (target < 0) {break;}if (numsHash[target]&& (numsHash[target] - 1) !== j&& (numsHash[target] - 1) !== k) {var arr = [list[j], list[k], target];var resultHashKey = arr.sort().join('_');if (!resultHash[resultHashKey]) {result.push(arr);resultHash[resultHashKey] = true;}}}}return result;
};