var fourSumCount = function (nums1, nums2, nums3, nums4) {
let s1 = new Map();
let n = nums1.length
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (s1.has((nums1[i] + nums2[j]))) {
let c = s1.get(nums1[i] + nums2[j]) + 1
s1.set(nums1[i] + nums2[j], c)
}
else (
s1.set(nums1[i] + nums2[j], 1)
)
}
}
let count=0
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (s1.has((0 - nums3[i] - nums4[j]))) {
count += (s1.get(0 - nums3[i] - nums4[j]) || 0)
}
}
}
return count
}
/*随想录做法
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const twoSumMap = new Map();
let count = 0;
for(const n1 of nums1) {
for(const n2 of nums2) {
const sum = n1 + n2;
twoSumMap.set(sum, (twoSumMap.get(sum) || 0) + 1)
}
}
for(const n3 of nums3) {
for(const n4 of nums4) {
const sum = n3 + n4;
count += (twoSumMap.get(0 - sum) || 0)
}
}
return count;
};
*/
第一想法
设两个map表,前面记key两数相加,后面记val次数。最后相乘。最后实施不了。要实施又要for遍历nums1+nums2
困难
- 他可以s1.get[key],但val怎么取得?s1[1]的做法,好像不行
收获
- 简便写法
for(const n3 of nums3) { for(const n4 of nums4) { const sum = n3 + n4; count += (twoSumMap.get(0 - sum) || 0) } }
- js的map可以覆盖,只要key相同,后面的val覆盖
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
let s1 = new Map();
let n1 = ransomNote.length
let n2=magazine.length
if(n1>n2) return false
for (let i = 0; i < n2 ;i++) {
s1.set(magazine[i], (s1.get(magazine[i])||0)+1)
}
let count=0
for (let i = 0; i < n1; i++) {
if (s1.has(ransomNote[i])){
if(s1.get(ransomNote[i])===0)
return false
else
s1.set(ransomNote[i], (s1.get(ransomNote[i]))-1)
}
else return false
}
return true
};
/*随想录用数组
var canConstruct = function(ransomNote, magazine) {
const strArr = new Array(26).fill(0),
base = "a".charCodeAt();
for(const s of magazine) {
strArr[s.charCodeAt() - base]++;
}
for(const s of ransomNote) {
const index = s.charCodeAt() - base;
if(!strArr[index]) return false;
strArr[index]--;
}
return true;
};
*/
第一想法
和上面一道题思想差不多
思考
如果key的值不多,就数组,像这道题
如果key的值多,map,set(没有重复)
/**
* @param {number[]} nums
* @return {number[][]}
*/
function sortNumber(a, b) {
return a - b
}
var threeSum = function(nums) {
nums=nums.sort(sortNumber)
let sum=0
let res = new Array().fill(0).map(() => new Array(3).fill(0));
// let res = [][3]
if(nums.length===3){ //判断只有三个元素的情况
for(var i of nums)
sum+=i
if(sum===0)
return [nums]
else return res;
}
let l=1;
let c=0
let r=nums.length-1
for(let a=0;a<nums.length-3;a++){
r=nums.length-1
l=a+1
while(l<r)
{
sum=nums[a]+nums[l]+nums[r];//加起来
if(sum===0){
res[c++]=[nums[a],nums[l],nums[r]];
while(nums[l+1]===nums[l])
l++;
while(nums[r-1]===nums[r])
r--;
l++
r--
}
else if(sum<0){
while(nums[l+1]===nums[l])
l++;
l++
}
else{
while(nums[r-1]===nums[r])
r--;
r--
}
}
while(nums[a+1]===nums[a])
a++;
}
return res
};
//[-3,-1,4][-2,-1,3]
思路
随想录中,三指针,但要注意重复
困难
- l++ r–的位置
while的位置
- nums.sort()有问题
负数它按绝对值在排序-1,-2,-4,0,1,2,3
解决方法:
将数组排序
nums.sort((a, b) => a - b)
收获
- sort
nums.sort((a, b) => a - b)
- 三指针思路
- 思想:// 数组排过序,如果第一个数大于0直接返回res
if (iNum > 0) return res
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
var fourSum = function(nums, target) {
nums.sort((a, b) => a - b)
let n=nums.length
let res = new Array().fill(0).map(() => new Array(4).fill(0));
let l=2;
let r=n-1
let sum=0
let c=0
for(let i=0;i<=n-4;i++){
for(let j=i+1;j<=n-3;j++){
r=n-1
l=j+1
while(l<r)
{
sum=nums[i]+nums[j]+nums[l]+nums[r];//加起来
if(sum===target){
res[c++]=[nums[i],nums[j],nums[l],nums[r]];
while(nums[l+1]===nums[l]) //去重
l++;
while(nums[r-1]===nums[r])
r--;
l++
r--
} // 对nums[l]和nums[r]去重
else if(sum<target){
while(nums[l+1]===nums[l])
l++;
l++
}
else{
while(nums[r-1]===nums[r])
r--;
r--
}
}
while(nums[j+1]===nums[j])
j++;
} while(nums[i+1]===nums[i])
i++;
}
return res
}
//[-3,-1,4][-2,-1,3]
思路
四指针,但要注意重复
困难
- 判断, 双智指针里的if (iNum > 0) return res不作数。
-4+5>-11,但右边的数加上就可以
收获
- const res = []; res.push([nums[i], nums[j], nums[l], nums[r]]);//随想录里竟然是这个