242. 有效的字母异位词
给定两个字符串
s
和t
,编写一个函数来判断t
是否是s
的字母异位词。注意:若
s
和t
中每个字符出现的次数都相同,则称s
和t
互为字母异位词。
思想
通过一个数组统计s中所有的字母出现的次数,然后再对t进行遍历,从数组中删除t出现的字母。最后对数组进行遍历,若有不为0的数,则说明某个字符出现次数不同,则不满足条件。否则就满足条件。
代码
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> re(26);
for(int i=0;i<s.size();i++)
{
re[s[i]-'a']++;
}
for(int i=0;i<t.size();i++)
{
re[t[i]-'a']--;
}
for(int i=0;i<re.size();i++)
{
if (re[i]!=0)
return false;
}
return true;
}
};
算法复杂度:O(n)。
349. 两个数组的交集
给定两个数组
nums1
和nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思想
用set表对nums1去重,然后遍历nums2,用另外一个set表存储相同的元素(自动去重)。然后进行输出即可。
代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set <int> set(nums1.begin(),nums1.end());
unordered_set <int> num;
for(int i:nums2){
if(set.count(i)){
num.insert(i);
}
}
return vector<int> (num.begin(),num.end());
}
};
202. 快乐数
编写一个算法来判断一个数
n
是不是快乐数。「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果
n
是 快乐数 就返回true
;不是,则返回false
。
思想
不停计算替换为平方和的过程,并用哈希表存储初始的数字和替换后的数字,若之后替换的数字在哈希表已经存储过,则说明进入无限循环,返回false。如果结果能变换为1,则返回true。
代码
class Solution {
public:
bool isHappy(int n) {
unordered_set <int> set;
while(n!=1){
if(!set.count(n)){
set.insert(n);
n=getnum(n);
}
else return false;
}
return true;
}
int getnum(int n){
int sum=0;
int t=0;
while(n){
t=n%10;
sum+=t*t;
n=n/10;
}
return sum;
}
};
算法复杂度:O(logn)。
1. 两数之和
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思想
本题其实有四个重点:
- 为什么会想到用哈希表:需要快速查询访问过的元素和当前访问的元素之和是否满足条件。
- 哈希表为什么用map:需要存储访问过的元素和数组下标,方便查询。
- 本题map是用来存什么的:key存储元素,value存储下标。
- map中的key和value为什么这么存:key是需要进行查询的对象,value是查询到的值。
代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
map.insert({nums[0],0});
for(int i=1;i<nums.size();i++){
if(map.count(target-nums[i])){
return {map.find(target-nums[i])->second,i};
}
else map.insert({nums[i],i});
}
return {};
}
};
算法复杂度:O(n)