Leetcode242.有效的字母异位词
1.思路
由于字母总共26个,所以有限空间,要标记出现的次数,直接用vector来标记,a-z可以用相对下标来表示(x的下标为x-'a')
2.代码
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> vec(26, 0);
for(int i=0;i<s.size();i++){
vec[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
vec[t[i]-'a']--;
}
for(int i=0;i<vec.size();i++){
if(vec[i]!=0) return false;
}
return true;
}
};
3.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
4.Reference:代码随想录
Leetcode349.两个数组的交集
1.思路
由于题目没有限定数值的大小,无法使用数组来进行哈希实现。所以考虑用集合:std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
重点:
1.注意返回类型为vector<int>,所以还要进行转变类型
2.注意set的插入操作是insert,删除操作为erase
2.代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;
unordered_set<int> set1(nums1.begin(),nums1.end());//将nums1中的元素初始化到set1中
for(auto num:nums2){//遍历nums2
if(set1.find(num)!=set1.end()){//如果nums2中的元素出现在nums1中
result.insert(num);//将其插入result中
}
}
vector<int> result1(result.begin(),result.end());
return result1;
}
};
3.复杂度分析
时间复杂度:O(m+n)
空间复杂度:O(1)
4.Reference:代码随想录
Leetcode202.快乐数
1.思路
题目中说了会 无限循环,那么也就是说求和的过程中,happy会重复出现,这对解题很重要!
用unordered_set来标记sum。
2.代码
class Solution {
public:
int getsum(int n){//获取每位平方之和函数
int sum=0;
while(n){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> result;
int happy=n;
while(1){
if(happy==1) //若出现快乐数
return true;
if(result.find(happy)!=result.end()) //若happy重复出现
return false;
result.insert(happy);
happy=getsum(happy);//修改happy
}
}
};
3.复杂度分析
时间复杂度:O(log n)
空间复杂度:O(log n)
4. Reference:代码随想录
Leetcode1.两数之和
1.思路
使用数组和set来做哈希法的局限。
- 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
- set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。
此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。
注意:
1.第一个for不能用for(auto it:nums),因为要返回下标,所以只能用i。
2.注意使用迭代器访问map
2.代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map1;
for(int i=0;i<nums.size();i++){
auto iter=map1.find(target-nums[i]);//iter为map1的迭代器
if(iter!=map1.end()){
return {iter->second,i};
}
map1.insert(pair<int,int>(nums[i],i));
}
return {};
}
};
3.复杂度分析
时间复杂度: O(n)
空间复杂度:O(n)