背景
最近在找机会,大厂面试避免不了算法,回来和同事讨论,给我推荐了一个https://leetcode-cn.com/store/网站,上面有许多算法题,大家有事没事可以看看,提高一下逻辑思维能力
题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解决思路
1.现将数组排序,方便后面计算和及返回数组去重
2.计算3个数字之和其实是两个数字子和的变种
a[i]+a[j]+a[k] = 0 转化为a[i]+a[j] = -a[k]
3.数组有序,通过第一项i固定,j = i+1,k=n-1[n为数组的长度]
a[i]+a[j]+a[k] > 0 k--
a[i]+a[j]+a[k] < 0 j++
4.循环计算a[i],a[j],a[k],循环的条件为j<k
5.二维数组去重
通过定义一个空对象,key的值为二维数组的每一个元素项即一维数组的每一个元素组成的字符串,判断对象中是否存在该key,如果不存在,将该以为数组获取到
代码实现
var threeSum = function (nums) {
if(nums.length<3){
return []
}
//放数组的容器
var result = [];
var lastResult = [];
// 1,对数组排序从小到大
nums.sort(function (a, b) {
return a - b;
})
//计算两个数的和变种[使用双重循环,a[0]+a[1]+a[n-1]]
// 如果a[0]+a[1]+a[n-1]>0 k--
// 如果a[0]+a[1]+a[n-2]<0 j++
var flag = nums.every(function(ele){
return ele === 0
})
if(flag){
return [[0,0,0]]
}
for (var i = 0, n = nums.length; i < n - 2; i++) {
var j = i + 1;
var k = n - 1;
var statm = []
while (j < k) {
var temp = [];
var sum_two = nums[i] + nums[j];
if (sum_two + nums[k] > 0) {
k--;
} else if (sum_two + nums[k] < 0) {
j++
} else {
temp = [nums[i], nums[j], nums[k]]
result.push(temp);
//寻找下一组
j++;
k--;
}
}
}
lastResult = unique(result);
return lastResult;
};
function unique(arr){
var result = [];
var cache = {}
for(var i = 0;i< arr.length;i++){
var key = '';
for(var j = 0;j<arr[i].length;j++){
key += `${arr[i][j]}`
}
if(!cache[key]){
cache[key] = 1;
result.push(arr[i])
}
}
return result
}
console.log(threeSum([-1, 0, 1, 2, -1, -4]));
网友评论