242. 有效的字母异位词
难度 2
题解 1 26 数组记录
var isAnagram = function(s, t) {
if(s.length!=t.length) return false;
const res = new Array(26).fill(0);
const base = "a".charCodeAt();
for(const i of s){
res[i.charCodeAt()-base]++;
}
for(const i of t){
res[i.charCodeAt()-base]--;
if(res[i.charCodeAt()-base]<0) return false;
}
return true;
};
复杂度
时间 On 空间 O1
思路
这里用数组比用 map 性能更好, 因为只有 26 个字母, 而 map 需要维护哈希表还要做哈希函数
349. 两个数组的交集
难度 2
题解 1 秀操作
var intersection = function(nums1, nums2) {
return Array.from(new Set(nums1.filter(i=>nums2.includes(i))));
};
复杂度
题解 2 Set
var intersection = function(nums1, nums2) {
const resSet = new Set();
const nums1Set = new Set(nums1);
for(let i of nums2){
if(nums1Set.has(i)){
resSet.add(i);
}
}
return Array.from(resSet);
};
复杂度
时间 On 空间 On
思路
注意使用 for of时, i 直接指的是 nums[i]而不需要里面再使用 nums[i]
202. 快乐数
难度 3
题解 1
var getSum = function(n) {
let sum = 0, temp = 0;
while(n){
temp = n%10;
sum+=temp**2;
n = Math.floor(n/10);
}
return sum;
};
var isHappy = function(n){
let set = new Set();
while(n!=1&&!set.has(n)){
set.add(n);
n = getSum(n);
}
return n==1;
}
复杂度
思路
难点在无限循环, 重复出现
有点想用递归做
这里要多用一个方法
1. 两数之和
难度 1
题解 1
var twoSum = function(nums, target) {
const res = new Map();
let count = 0;
nums.forEach( item => res.set(item, count++));
for(let i =0;i<nums.length;i++){
let j = target-nums[i];
if(res.has(j)&&res.get(j)!=i){
return [i, res.get(j)];
}
}
};
复杂度
思路
454. 四数相加 II
难度 3
题解 1
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const res = new Map();
for(let i of nums1){
for(let j of nums2){
let sum = i + j;
res.set(sum,(res.get(sum)||0)+1);
}
}
let count = 0;
for(let i of nums3){
for(let j of nums4){
let sum = i + j;
if(res.has(0-sum)) count+=res.get(0-sum);
}
}
return count;
};
复杂度
思路
要分成两份, 第一部分求 sum 的时候不需要判断是否 has
383. 赎金信
难度 3
题解 1
var canConstruct = function(ransomNote, magazine) {
const res = new Array(26).fill(0);
const base = "a".charCodeAt();
for(let i of magazine){
res[i.charCodeAt()-base]++;
}
for(let i of ransomNote){
res[i.charCodeAt()-base]--;
if(res[i.charCodeAt()-base]<0) return false;
}
return true;
};
复杂度
思路
和前面那题一模一样
15. 三数之和
难度 3
题解 1
var threeSum = function(nums) {
const len = nums.length;
if(len<3) return [];
nums.sort((a,b)=>a-b);
const res = [];
for(let i = 0;i<len-2;i++){
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;
let l = i+1, r = len-1;
while(l<r){
let sum = nums[i]+nums[l]+nums[r];
if(sum<0){
l++;
continue;
}
if(sum>0){
r--;
continue;
}
res.push([nums[i],nums[l],nums[r]]);
while(nums[l]==nums[++l]);
while(nums[r]==nums[--r]);
}
}
return res;
};
复杂度
思路
核心在于将三次循环变成两次, 并且考虑去重
后面使用双指针
18. 四数之和
难度 3
题解 1
var fourSum = function(nums, target) {
const len = nums.length;
if(len<4) return [];
nums.sort((a,b)=>a-b);
const res = [];
for(let i = 0;i<len-3;i++){
if(i>0&&nums[i]==nums[i-1]) continue;
for(let j = i+1;j<len-2;j++){
if(j>i+1&&nums[j]==nums[j-1]) continue;
let l = j+1, r = len-1;
while(l<r){
let sum = nums[i]+nums[j]+nums[l]+nums[r];
if(sum<target) {l++;continue;}
if(sum>target) {r--;continue;}
res.push([nums[i],nums[j],nums[l],nums[r]]);
while(nums[l]==nums[++l]);
while(nums[r]==nums[--r]);
}
}
}
return res;
};
复杂度
思路
换汤不换药, 不过注意两点
一个是 j>i+1
一个是双指针别忘了 while 循环