454 四数相加-2
我们可以先把num1和num2的所有可能的和加到哈希表中,然后在遍历num3和num4,把所有可能和计算出来,并检查哈希表中是否有(0-sum),如果有的话就把哈希表的值加到结果中
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const map = new Map()
let res = 0
for (const n of nums1) {
for (const n2 of nums2) {
const sum = n + n2
if (!map.has(sum)) {
map.set(sum, 0)
}
map.set(sum, map.get(sum) + 1)
}
}
for (const n of nums3) {
for (const n2 of nums4) {
const sum = n + n2
if (map.has(0 - sum)) {
res += map.get(0 - sum)
}
}
}
return res
};
383 赎金信
我们可以用一个哈希表来把magzine中的char存在哈希表中,然后遍历ransomnote来查看是否有匹配的字符
var canConstruct = function(ransomNote, magazine) {
const map = new Map()
for (const c of magazine) {
if (!map.has(c)) {
map.set(c, 0)
}
map.set(c, map.get(c) + 1)
}
for (const c of ransomNote) {
if (!map.has(c)) {
return false
} else {
map.set(c, map.get(c) - 1)
if (map.get(c) === 0) {
map.delete(c)
}
}
}
return true
};
15 三数之和
用双指针操作。因为涉及到去重,并且由于题目中没有要求答案固定顺序,所以我们可以先把nums数组排序。遍历排序后的数组,去重并剪枝。固定一个数组之和,用双指针的技巧来确定第二和第三个数字。
var threeSum = function(nums) {
let res = []
if (!nums || nums.length < 3) {
return res
}
nums.sort((a, b) => a - b)
for (let i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
break
}
if (i > 0 && nums[i] === nums[i-1]) {
continue
}
let left = i + 1, right = nums.length - 1
while (left < right) {
const sum = nums[i] + nums[left] + nums[right]
if (sum === 0) {
res.push([nums[i], nums[left], nums[right]])
// 需要注意的是:把一个合理的结果放入结果数组之后,我们要对重复的去重。
while (left < right && nums[left] === nums[left+1]) {
left += 1
}
left += 1
while (left < right && nums[right] === nums[right-1]) {
right -= 1
}
right -= 1
} else if (sum > 0) {
right -= 1
} else {
left += 1
}
}
}
return res
};
18 四数之和
var fourSum = function(nums, target) {
const res = []
nums.sort((a, b) => a - b)
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; j++) {
if (j > i + 1 && nums[j] === nums[j-1] ) {
continue
}
let left = j + 1, right = nums.length - 1
while (left < right) {
if ((nums[left] + nums[right] + nums[i] + nums[j]) > target) {
right -= 1
} else if ((nums[left] + nums[right] + nums[i] + nums[j]) < target) {
left += 1
} else {
res.push([nums[i], nums[j], nums[left], nums[right]])
while (left < right && nums[left] === nums[left + 1]) {
left += 1
}
left += 1
while (left < right && nums[right] === nums[right - 1]) {
right -= 1
}
right -= 1
}
}
}
}
return res
};