没思路,看了别人的过程之后明白了,和之前的两数相加一样,这里的四个数组两个放在一起看,把两个数组中所有的两个数都加起来,存在map里面,然后和两数相加那道题的做法一样就行。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @param {number[]} nums4
* @return {number}
*/
var fourSumCount = function(nums1, nums2, nums3, nums4) {
let sumab = new Map();
let result=0;
for(let i=0;i<nums1.length;i++) {
for(let j=0;j<nums2.length;j++) {
if(sumab.has(nums1[i]+nums2[j])) {
sumab.set(nums1[i]+nums2[j],sumab.get(nums1[i]+nums2[j])+1);
}
else sumab.set(nums1[i]+nums2[j],1);
}
}
for(let i=0;i<nums3.length;i++) {
for(let j=0;j<nums4.length;j++) {
if(sumab.has(0-nums3[i]-nums4[j])) {
result+=sumab.get(0-nums3[i]-nums4[j]);
}
}
}
return result;
};
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
let map = new Map();
for(let i of magazine) {
if(map.has(i)) {
map.set(i,map.get(i)+1);
}
else map.set(i,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;
};
因为只有小写字母构成,所以可以开一个数组,数组要比map的性能好一些。
(未通过)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
nums.sort((a,b)=>{return a-b})
let l,r;
let result = new Array();
for(let i=0;i<nums.length;i++) {
l=i+1;r=nums.length-1;
while(l<r)
{
if(nums[i]+nums[l]+nums[r]>0) {
r--;
}
else if(nums[i]+nums[l]+nums[r]<0) {
l++;
}
else if(nums[i]+nums[l]+nums[r]===0) {
if(!result.includes([nums[i],nums[l],nums[r]])) {
result.push([nums[i],nums[l],nums[r]]);
}
l++;
continue;
}
}
}
return result;
};
想这么写去掉重复的三元组,但是没通过,经过查阅资料才知道,原来js不能用includes判断二维数字中是否含某个一维数组。
所以只能手动判断一下result里是否包含重复三元组了。
(通过)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
nums.sort((a,b)=>{return a-b})
let l,r;
let result = new Array();
for(let i=0;i<nums.length;i++) {
l=i+1;r=nums.length-1;
while(l<r)
{
if(nums[i]+nums[l]+nums[r]>0) {
r--;
}
else if(nums[i]+nums[l]+nums[r]<0) {
l++;
}
else if(nums[i]+nums[l]+nums[r]===0) {
let flag=false;
for(let k of result) {
if(k[0]==nums[i]&&k[1]==nums[l]&&k[2]==nums[r]) {
flag=true;
break;
}
}
if(flag===false) result.push([nums[i],nums[l],nums[r]]);
l++;
continue;
}
}
}
return result;
};
18. 四数之和
和上一道题思路一样
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
var fourSum = function(nums, target) {
nums.sort((a,b)=>{return a-b});
let result = new Array();
for(let i=0;i<nums.length;i++) {
for(let j=i+1;j<nums.length;j++) {
let l=j+1;
let r=nums.length-1;
while(l<r) {
if(nums[i]+nums[j]+nums[l]+nums[r]<target) {
l++;
}
else if(nums[i]+nums[j]+nums[l]+nums[r]>target) {
r--;
}
else if(nums[i]+nums[j]+nums[l]+nums[r]===target) {
let flag = false;
for(let k of result) {
if(k[0]===nums[i]&&k[1]===nums[j]&&k[2]===nums[l]&&k[3]===nums[r]) {
flag=true;
break;
}
}
if(flag===false) {
result.push([nums[i],nums[j],nums[l],nums[r]]);
}
l++;
continue;
}
}
}
}
return result;
};