383
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
const charDict = {}
for(let i = 0 ; i < magazine.length; i++){
charDict[magazine[i]] = 0
}
for(let j = 0; j < ransomNote.length; j++){
if(!charDict[ransomNote[j]]){
return false
}
}
return true
};
454
之前写过一版本的python 的解法,然后又写了一下js的解法,但其实执行的时间上是比较慢的
执行用时:536 ms, 在所有 JavaScript 提交中击败了5.20%的用户
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @param {number[]} nums4
* @return {number}
*/
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const nums_dict ={}
for(let i of nums1){
for(let j of nums2){
if((i+j) in nums_dict){
nums_dict[i+j] += 1
}else{
nums_dict[i+j] = 1
}
}
}
let count = 0
for(let i of nums3){
for(let j of nums4){
let key = - i - j
if(key in nums_dict){
count += nums_dict[key]
}
}
}
return count
};
15
卡在nums.sort()
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
//用默认的compare的话 -4 > -1 会在测试用例报错
nums.sort(function(a, b) {
return a - b;
})
const res = []
for(let i = 0; i < nums.length; i++){
// 遇到重复值跳过
if(nums[i] == nums[i-1]){
continue
}
let left = i + 1
let right = nums.length - 1
// 双指针
while(left < right){
if(nums[i] + nums[left] + nums[right] < 0){
left += 1
}else if (nums[i] + nums[left] + nums[right] > 0){
right -= 1
}else{
res.push([nums[i], nums[left], nums[right]])
// 遇到重复值跳过
while(nums[left] == nums[left+1] && (left < right - 1)){
left += 1
}
while(nums[right] == nums[right-1] && (left < right - 1)){
right -= 1
}
left += 1
right -= 1
}
}
}
return res
};
18
在三数之和上面的加强版本
执行用时:80 ms, 在所有 JavaScript 提交中击败了69.35%的用户
内存消耗:43.1 MB, 在所有 JavaScript 提交中击败了73.77%的用户
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
var fourSum = function(nums, target) {
//用默认的compare的话 -4 > -1 会在测试用例报错
nums.sort(function(a, b) {
return a - b;
})
const res = []
//两个循环+ 双指针
for(let i = 0; i < nums.length; i++){
// 遇到重复值跳过
if(nums[i] == nums[i-1]){
continue
}
for(let j = i + 1; j < nums.length; j++){
// 遇到重复值跳过, j 至少应该算一遍,bad case [2,2,2,2,2]
if(nums[j] == nums[j-1] && j != (i+1)){
continue
}
let left = j + 1
let right = nums.length - 1
while(left < right){
if(nums[i] + nums[j] + nums[left] + nums[right] < target){
left += 1
}else if(nums[i] + nums[j] + nums[left] + nums[right] > target){
right -= 1
}else{
res.push([nums[i], nums[j], nums[left], nums[right]])
// 遇到重复值跳过
while(nums[left] == nums[left+1] && (left < right - 1)){
left += 1
}
// 遇到重复值跳过
while(nums[right] == nums[right-1] && (left < right - 1)){
right -= 1
}
left += 1
right -= 1
}
}
}
}
return res
};