前言
二数之和是好多人刷LeetCode的第一道题,很多坚持不下来的小伙伴们,三数之和四数之和了解一下。
两数之和
这里使用哈希表来解决
function twoSum(nums, target) {
let map = {};
for (let i = 0; i < nums.length; i++) {
if (map[nums[i]] !== undefined) return [map[nums[i]], i];
else map[target - nums[i]] = i;
}
}
三数之和
这里使用双指针来解决
function threeSum(nums) {
nums.sort((a, b) => a - b);
let res = [];
for (let i = 0; i < nums.length - 1; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue;
let j = -nums[i],
start = i + 1,
end = nums.length - 1;
while (start < end) {
let cur = nums[start] + nums[end];
if (cur < j) start++;
else if (cur > j) end--;
else {
res.push([nums[i], nums[start], nums[end]]);
while (nums[start] === nums[start + 1]) start++;
while (nums[end] === nums[end - 1]) end--;
end--;
start++;
}
}
}
return res;
}
四数之和
同三数之和很像,如果再出五数之和你会么?
function fourSum(nums, target) {
nums.sort((a, b) => a - b);
let res = [];
for (let i = 0; i < nums.length - 3; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue;
for (let j = i + 1; j < nums.length - 2; j++) {
if (j > i + 1 && nums[j] === nums[j - 1]) continue;
let k = target - nums[i] - nums[j],
start = j + 1;
end = nums.length - 1;
while (start < end) {
let cur = nums[start] + nums[end];
if (cur < k) start++;
else if (cur > k) end--;
else {
res.push([nums[i], nums[j], nums[start], nums[end]]);
while (nums[start] === nums[start + 1]) start++;
while (nums[end] === nums[end - 1]) end++;
start++;
end--;
}
}
}
}
return res;
}