454.四数相加II
主要是使用哈希表存前两数之和,js的map的值操作有点搞,需要记住
var fourSumCount = function(nums1, nums2,nums3, nums4) {
let CountAB = new Map()
for(let i of nums1){
for (let j of nums2) {
if(CountAB.has(i+j)){
CountAB.set(i+j,CountAB.get(i+j)+1)
}else{
CountAB.set(i+j,1)
}
}
}
let count = 0
for(let i of nums3){
for(let j of nums4){
if(CountAB.has(-i-j)){
count += CountAB.get(-i-j)
}
}
}
return count
}
383. 赎金信
注意两个放入map的顺序
var canConstruct = function(ransomNote, magazine) {
let map = new Map()
for(let i of magazine){
map.set(i,(map.get(i)||0)+1)
}
for(let i of ransomNote){
if(map.has(i)&&map.get(i)>0){
map.set(i,map.get(i)-1)
}else{
return false
}
}
return true
};
15. 三数之和
var threeSum = function(nums) {
const res = [], len = nums.length
// 将数组排序
nums.sort((a, b) => a - b)
for (let i = 0; i < len; i++) {
let l = i + 1, r = len - 1, iNum = nums[i]
// 数组排过序,如果第一个数大于0直接返回res
if (iNum > 0) return res
// 去重
if (iNum == nums[i - 1]) continue
while(l < r) {
let lNum = nums[l], rNum = nums[r], threeSum = iNum + lNum + rNum
// 三数之和小于0,则左指针向右移动
if (threeSum < 0) l++
else if (threeSum > 0) r--
else {
res.push([iNum, lNum, rNum])
// 去重
while(l < r && nums[l] == nums[l + 1]){
l++
}
while(l < r && nums[r] == nums[r - 1]) {
r--
}
l++
r--
}
}
}
return res
};
18. 四数之和
var fourSum = function(nums, target) {
const quadruplets = [];
if (nums.length < 4) {
return quadruplets;
}
nums.sort((x, y) => x - y);
const length = nums.length;
for (let i = 0; i < length - 3; i++) {
if (i > 0 && nums[i] === nums[i - 1]) {
continue;
}
if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
break;
}
if (nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target) {
continue;
}
for (let j = i + 1; j < length - 2; j++) {
if (j > i + 1 && nums[j] === nums[j - 1]) {
continue;
}
if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
break;
}
if (nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target) {
continue;
}
let left = j + 1, right = length - 1;
while (left < right) {
const sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum === target) {
quadruplets.push([nums[i], nums[j], nums[left], nums[right]]);
while (left < right && nums[left] === nums[left + 1]) {
left++;
}
left++;
while (left < right && nums[right] === nums[right - 1]) {
right--;
}
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
}
return quadruplets;
};