454.四数相加II
题目链接: 454.四数相加II
参考文档:代码随想录
状态:已完成,耗时40min
思路:除了暴力解法没有思路,看完答案发现最优解也需要O(n^2)时间复杂度,其中写完之后发现有问题,最后发现是有一个for循环漏了大括号。。代码如下:
var fourSumCount = function(nums1, nums2, nums3, nums4) {
let temp = new Map();
let result = 0;
let count = 0;
for(let i = 0;i<nums1.length;i++){
for(let j = 0;j<nums2.length;j++){
count = temp.get(-nums1[i]-nums2[j]);
if(count===undefined){
temp.set(-nums1[i]-nums2[j], 1);
}
else{
temp.set(-nums1[i]-nums2[j], count+1);
}
}
}
for(let k = 0;k<nums3.length;k++){
for(let l = 0;l<nums4.length;l++){
if(temp.get(nums3[k]+nums4[l])){
result+=temp.get(nums3[k]+nums4[l]);
}
}
}
return result;
};
383. 赎金信
题目链接: 383. 赎金信
参考文档:代码随想录
状态:已完成,耗时40min
思路:比较简单,和字母异位词比较类似
var canConstruct = function(ransomNote, magazine) {
let gather = new Map();
magazine = magazine.split("");
ransomNote = ransomNote.split("");
for(const letter of magazine){
let count = gather.get(letter);
gather.set(letter,(count||0)+1);
}
for(const letter of ransomNote){
let count = gather.get(letter);
if(count==undefined) return false;
gather.set(letter,count-1); //count--是什么时候才会生效?
if(gather.get(letter)<0) return false;
}
return true;
};
第15题. 三数之和
题目链接: 第15题. 三数之和
参考文档:代码随想录
状态:已完成,耗时两小时
思路:没有思路,看了答案决定用双指针,后面在去重上一直吃瘪,感觉还是有技巧的。
第15题. 三数之和
题目链接: 第15题. 三数之和
参考文档:代码随想录
状态:已完成,耗时两小时
思路:没有思路,看了答案决定用双指针,后面在去重上一直吃瘪,感觉还是有技巧的。
var threeSum = function(nums) {
let ret = [];
nums = nums.sort((a,b)=>(a-b));
for(let i = 0;i<nums.length-2;i++){
if(nums[i]>0) return ret;
let left = i+1;
let right = nums.length-1;
if(nums[i]==nums[i-1] && i>0) continue;
while(left<right){
if(nums[i]+nums[left]+nums[right]===0){
ret.push([nums[i],nums[left],nums[right]]);
while(nums[left]===nums[left+1]) left++;
while(nums[right]===nums[right-1]) right--;
}
nums[i]+nums[left]+nums[right]>0?right--:left++;
}
}
return ret;
};
第18题. 四数之和
题目链接: 第18题. 四数之和
参考文档:代码随想录
状态:已完成,耗时一小时
思路:和三数之和一个思路,因为把箭头函数的用法搞错了导致花了很长时间
var fourSum = function(nums, target) {
let ret = [];
nums = nums.sort((a,b) =>
a-b
);
for(let i =0;i<nums.length-3;i++){
if(nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) break;
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){
let sum = nums[i]+nums[j]+nums[left]+nums[right];
if(sum===target){
ret.push([nums[i],nums[j],nums[left],nums[right]]);
while(left < right && nums[left]===nums[left+1]){
left++;
}
left++;
while(left < right && nums[right]===nums[right-1]){
right--;
}
right--;
}else if(sum<target){
left++;
}else right--;
}
}
}
return ret;
};