leetcode-15-3sum
来源:互联网 发布:梦里花落知多少解释 编辑:程序博客网 时间:2024/05/19 19:30
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转成hash for (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,再加上后面的肯定不为0 if (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;};
阅读全文
1 0
- Leetcode 15 3Sum
- LeetCode 15: 3Sum
- leetcode 15 3Sum
- [leetcode 15] 3Sum
- Leetcode【15】:3Sum
- [leetcode 15] 3Sum
- [Leetcode] 15 - 3Sum
- leetcode.15-----------3Sum
- leetcode 15 3Sum
- leetcode-15 3Sum
- 3Sum - LeetCode 15
- Leetcode #15 3 Sum
- LeetCode---(15) 3 sum
- LeetCode 15 - 3Sum
- leetcode-15 3sum
- leetcode 15 -- 3Sum
- Leetcode[15]-3Sum
- LeetCode 15: 3 Sum
- Meavn 搭建项目遇到Error creating bean with name 'sessionFactory' defined in class path resource
- 聚类(clustering)
- Java设计模式(一)
- MySQL单表查询
- Magento中Mage::getModel 函数
- leetcode-15-3sum
- Superheterodyne receiver
- 基础练习 十六进制转八进制
- eclipse 工程报错
- 小愿景,职业发展,思维拓展
- 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例
- Magento中Mage::getSingleton函数
- 入门训练 序列求和
- SpringMVC用户登录和拦截器简单应用增删改查