15. 三数之和
2018-12-19 本文已影响0人
Jason_Shu
题目链接:https://leetcode-cn.com/problems/3sum/description/
思路:
第一种思路:暴力穷举法,用三个循环,时间复杂度O(N³)。
第二种思路:为了使a+b+c=0, 先把nums数组sort一下(从小打大),a还是遍历一遍数组,但是申请两个「指针」来遍历a元素后的元素。left指向a后面的元素,right指向数组最后一个元素。这里有两个去重措施,第一个是在第一轮遍历中,用hash来判断是否有重复的目标数组。第二个是在while循环中,如果找到目标数组移动left和right后的元素与上一个相同,则直接跳过达到「去重」效果。
代码:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
let left;
let right;
let temp;
let sum = 0;
let hash = {};
let result = [];
nums.sort((a, b) => {
return a-b;
});
for(let i = 0; i < nums.length - 1; i++) {
left = i + 1;
right = nums.length - 1;
while(left < right) {
sum = nums[i] + nums[left] + nums[right];
if(sum > 0) {
right--;
} else {
if(sum < 0) {
left++;
} else {
if (sum === 0 && [nums[i], nums[left], nums[right]]) {
temp = [nums[i], nums[left], nums[right]];
if(!(temp in hash)) {
hash[temp] = 1;
result.push(temp);
}
left++;
right--;
//如果当前left和right所指元素与上一个相同,则忽略跳过,是为了在结果中去重
while(left < right && nums[left] === nums[left-1]) left++;
while(left < right && nums[right] === nums[right+1]) right--;
}
}
}
}
}
return result;
};