454 四数相加
454 四数相加
var fourSumCount = function(nums1, nums2, nums3, nums4) {
//哈希表
let map = new Map();
let res = 0;
for (let i = 0; i < nums1.length; i++) {//遍历nums1
for (let j = 0; j < nums2.length; j++) { //遍历nums2
let sum = nums1[i] + nums2[j]; //计算和
map.set(sum, map.has(sum) ? map.get(sum) + 1 : 1); //存入哈希表 key为和,value为出现次数
}
}
for (let i = 0; i < nums3.length; i++) {//遍历nums3
for (let j = 0; j < nums4.length; j++) {//遍历nums4
let sum = nums3[i] + nums4[j]; //计算和
if (map.has(-sum)) { //如果哈希表中有和为-sum的值,说明存在一组解
res += map.get(-sum); //累加次数
}
}
}
return res;
};
383 赎金信
383 赎金信
var canConstruct = function(ransomNote, magazine) {
//哈希表
let map = new Map();
for (let i = 0; i < magazine.length; i++) {//遍历magazine 将字符存入哈希表 key为字符,value为出现次数
map.set(magazine[i], map.has(magazine[i]) ? map.get(magazine[i]) + 1 : 1);
}
for (let i = 0; i < ransomNote.length; i++) {// 遍历ransomNote 如果哈希表中没有该字符或者次数为0,说明不能构成赎金信 返回false
if (!map.has(ransomNote[i])) return false;
if (map.get(ransomNote[i]) == 0) return false;
map.set(ransomNote[i], map.get(ransomNote[i]) - 1);
}
return true;
}
15 三数之和
15 三数之和
var threeSum = function(nums) {
//哈希表
let res = [];
nums.sort((a, b) => a - b); //排序
for (let i = 0; i < nums.length; i++) {
if (nums[i] > 0) break; //如果当前数字大于0,则三数之和一定大于0,所以结束循环
if (i > 0 && nums[i] == nums[i - 1]) continue; //去重
let map = new Map();
for (let j = i + 1; j < nums.length; j++) {
if (map.has(-nums[i] - nums[j])) { //如果哈希表中存在和为0的两个数,说明存在一组解
res.push([nums[i], nums[j], -nums[i] - nums[j]]);
while (j + 1 < nums.length && nums[j] == nums[j + 1]) j++; //去重
}
map.set(nums[j], j); //将当前数字存入哈希表
}
}
return res;
};
18 四数之和
18 四数之和
var fourSum = function(nums, target) {
//双指针
let res = [];
nums.sort((a, b) => a - b); //排序
for (let i = 0; i < nums.length; 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;
let right = nums.length - 1;
while (left < right) {
let sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
res.push([nums[i], nums[j], nums[left], nums[right]]);
while (left < right && nums[left] == nums[left + 1]) left++; //去重
while (left < right && nums[right] == nums[right - 1]) right--; //去重
left++;
right--;
} else if (sum < target) left++;
else if (sum > target) right--;
}
}
}
return res;
}