思路:用空间换时间 定义足够大小数组记录字母出现的次数
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26];
for(int i=0;i<s.size();i++){
record[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
record[t[i]-'a']--;
}
for(int i=0;i<26;i++)
{
if(record[i]!=0)
return false;
}
return true;
}
};
思路:使用集合去重 find函数寻找交集 考察容器unorde_set的使用
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//思路:set去重 result作为结果
unordered_set<int> s(nums1.begin(),nums1.end());
unordered_set<int> result;
for(int num:nums2){
//说明找到了
if(s.find(num)!=s.end())
result.insert(num);//可能重复插入但由于集合性质只有一个元素
}
return vector<int>(result.begin(),result.end());
}
};
思路:抓住本题的解题关键 无限循环 什么时候会无限循环 当出现重复数字的时候就是无限循环
还要加强重复不变量的思想
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> s;
while (n != 1 && s.find(n) == s.end()) {
s.insert(n);
int sum = 0;
// 计算平方和
while (n) {
int x = n % 10;
sum += x * x;
n /= 10;
}
// 更新 n 为 sum
n = sum;
}
// 如果 n 最终变为 1,则为快乐数
return n == 1;
}
};
思路:暴力解法 看完代码随想录发现新大陆
大概是 每次遍历一个元素 去集合里寻找 target-元素 若是有说明找到了 返回下标 因为要下标 所以用map储存 时间复杂度 也可以用数组实现 可能浪费空间.
代码: