学习目标:
● 454.四数相加II
● 383. 赎金信
● 15. 三数之和
● 18. 四数之和
● 总结
学习内容:
● 454.四数相加II
tip:使用map,先把前两个数组遍历相加,map存相加和 和 出现的次数。遍历后两个数据相加和,0-相加和。判断是否在map里,取value相加
题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html
需要在熟悉一下map的API
var fourSumCount = function(nums1, nums2, nums3, nums4) {
let resMap = new Map()
let count = 0;
for(let i = 0;i<nums1.length;i++){
for(let j=0;j<nums2.length;j++){
let x = nums1[i]+nums2[j]
resMap.set(x,(resMap.get(x)||0)+1)
}
}
for(let i = 0; i<nums3.length;i++){
for(let j=0;j<nums4.length;j++){
let y = 0-nums3[i]-nums4[j]
if(resMap.has(y)){
count+=resMap.get(y)
}
}
}
return count
};
学习内容:
● 383. 赎金信
题目链接/文章讲解:https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html
//练习题,思路类似242.有效的字母异位词
var canConstruct = function(ransomNote, magazine) {
let arr = new Array(26).fill(0)
let temp = "a".charCodeAt();
for(const i of magazine){
arr[i.charCodeAt()-temp]++
}
for(const j of ransomNote){
if(!arr[j.charCodeAt()-temp]) return false
arr[j.charCodeAt()-temp]--
}
return true
};
学习内容:
● 15. 三数之和
tip:双指针。去重
题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html
let arr = nums.sort((a, b) => a - b)//升序排序
//判断arr[i]>0时,是return result 第一次直接写成return???
//for循环里的continue是结束本次循环,继续下次循环
//对于nums[left]和nums[right]去重,使用while。写成了if
var threeSum = function(nums) {
let result = []
let arr = nums.sort((a, b) => a - b)
for(let i = 0; i<arr.length; i++){
if(arr[i]>0) return result
if(i>0 && arr[i]==arr[i-1]) continue
let left = i+1;
let right = arr.length-1;
while(left<right){
if(arr[i]+arr[left]+arr[right]>0){
right--
}else if(arr[i]+arr[left]+arr[right]<0){
left++
}else{
result.push([arr[i],arr[left],arr[right]])
while(left<right &&arr[left] == arr[left+1]){
left++;
}
while(left<right && arr[right]==arr[right-1]){
right--;
}
left++;
right--;
}
}
}
return result
};
学习内容:
● 18. 四数之和
题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.html
重点在去重和剪枝
var fourSum = function(nums, target) {
nums.sort((a,b)=>a-b)
let result = []
if(nums.length<4) return []
for(let i = 0;i<nums.length-3;i++){
if(nums[i]+nums[i+1]+nums[i+2]+nums[3]>target) return result
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 left = j+1
let right = nums.length-1
while(left<right){
if(nums[i]+nums[j]+nums[left]+nums[right] ==target){
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++
}else if(nums[i]+nums[j]+nums[left]+nums[right]<target){
left++
}else{
right--
}
}
}
}
return result
};