一、454 四数相加II
思路:先遍历两个数组,将它们的两两之和作为key,和出现的次数作为value填入map当中,然后遍历另外两个,将0-两数之和作为key去寻找,寻找到的value加在result上。
代码:
var fourSumCount = function(nums1, nums2, nums3, nums4) {
var n = nums1.length;
var map = new Map();
for (let i=0; i<n; i++) {
for (let k=0; k<n; k++) {
map.set(nums1[i]+nums2[k], map.has(nums1[i]+nums2[k]) ? map.get(nums1[i]+nums2[k]) + 1 : 1);
}
}
var result = 0;
for (let i=0; i<n; i++) {
for (let k=0; k<n; k++) {
var key = 0 - nums3[i] - nums4[k];
if (map.has(key)) {
result += map.get(key);
}
}
}
return result;
};
二、383 赎金信
这个在Day6已经写过了。详见http://t.csdn.cn/pYsYv。
三、15 三数之和
思路:自己想不出来,还是看卡哥的吧。去重我真的不会做!https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E5%8E%BB%E9%87%8D%E9%80%BB%E8%BE%91%E7%9A%84%E6%80%9D%E8%80%83
代码:
var threeSum = function(nums) {
nums.sort((a,b) => a - b);
var result = [];
for (let i=0; i<nums.length-2; i++) {
if (nums[i] > 0) {
return result;
}
if (i && (nums[i] == nums[i-1])) {
continue;
}
var left = i + 1;
var right = nums.length - 1;
while (left < right) {
var sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
}
else if (sum < 0) {
left++;
}
else {
result.push([nums[i], nums[left], nums[right]]);
// 这一段要记住
while (left<right && nums[left] == nums[left+1]) {
left++;
}
while (left<right && nums[right] == nums[right-1]) {
right--;
}
left++;
right--;
}
}
}
return result;
};
下次来看的时候去记一下代码随想录的代码
四、18 四数之和
思路:与三数之和一样,只不过是多套了一层循环
代码:
var fourSum = function(nums, target) {
var result = [];
nums.sort((a, b) => a - b);
if (nums.length < 4) {
return [];
}
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;
}
var left = j + 1;
var right = nums.length - 1;
while (left < right) {
var sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) {
right--;
}
else if (sum < target) {
left++;
}
else {
result.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--;
}
}
}
}
return result;
};
今日学习时长:1.5h左右
总结:今天实在是太累了,三数之和和四数之和都没有想出来,也没从头到尾写一遍,看了视频,要再巩固一下,周末的时候再看。下次再刷需要注意15题和18题。