背景
最近在找機(jī)會,大廠面試避免不了算法,回來和同事討論,給我推薦了一個(gè)https://leetcode-cn.com/store/網(wǎng)站,上面有許多算法題,大家有事沒事可以看看,提高一下邏輯思維能力
題目
給定一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組。
例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
解決思路
1.現(xiàn)將數(shù)組排序,方便后面計(jì)算和及返回?cái)?shù)組去重
2.計(jì)算3個(gè)數(shù)字之和其實(shí)是兩個(gè)數(shù)字子和的變種
a[i]+a[j]+a[k] = 0 轉(zhuǎn)化為a[i]+a[j] = -a[k]
3.數(shù)組有序,通過第一項(xiàng)i固定,j = i+1,k=n-1[n為數(shù)組的長度]
a[i]+a[j]+a[k] > 0 k--
a[i]+a[j]+a[k] < 0 j++
4.循環(huán)計(jì)算a[i],a[j],a[k],循環(huán)的條件為j<k
5.二維數(shù)組去重
通過定義一個(gè)空對象,key的值為二維數(shù)組的每一個(gè)元素項(xiàng)即一維數(shù)組的每一個(gè)元素組成的字符串,判斷對象中是否存在該key,如果不存在,將該以為數(shù)組獲取到
代碼實(shí)現(xiàn)
var threeSum = function (nums) {
if(nums.length<3){
return []
}
//放數(shù)組的容器
var result = [];
var lastResult = [];
// 1,對數(shù)組排序從小到大
nums.sort(function (a, b) {
return a - b;
})
//計(jì)算兩個(gè)數(shù)的和變種[使用雙重循環(huán),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]));