第二十天:力扣第15题,三数之和
地址:leetcode-cn.com/problems/3s…
思路:一开始常规暴力解题,一如既往的超时,后来想一想,看看解析,还是用排序加双指针吧:
先将数组进行排序从左侧开始,选定一个值为定值 ,右侧进行求解,获取与其相加为0的两个值,类似于快排,定义首和尾,首尾与定值相加等于0记录这三个值。小于0,首部右移;大于 0,尾部左移。最后定值右移,重复该步骤。
var threeSum = function(nums) {
nums.sort((a,b) => a - b);//排序
let i = 0;
let res = [];
if(nums[0] <= 0 && nums[nums.length - 1] >= 0)//筛选
{
while(i < nums.length - 2)//条件
{
let left = i + 1;
let right = nums.length - 1;
while(left < right)
{
if(nums[right] < 0)//筛选
{
break;
}
if(nums[i] + nums[left] + nums[right] === 0)
{
res.push([nums[i],nums[left],nums[right]]);//填充
while (nums[left] === nums[++left]) {}
}
else if(nums[i] + nums[left] + nums[right] < 0)
{
while (nums[left] === nums[++left]) {}//防止重合
}
else{
while (nums[right] === nums[--right]) {}//防止重合
}
}
while (nums[i] === nums[++i]) {}//防止重合
}
}
return res;
};
执行用时:180 ms, 在所有 JavaScript 提交中击败了46.17%的用户
内存消耗:47.8 MB, 在所有 JavaScript 提交中击败了30.60%的用户