242.有效的字母异位词
题目链接/文章讲解/视频讲解: 代码随想录
用数组将出现的字母存储到对应的位置
class Solution {
public:
bool isAnagram(string s, string t) {
// 用两个数组来存储各字母出现的次数
vector<int> r1(26, 0);
vector<int> r2(26, 0);
// 统计s中个字母出现的次数
for(int i = 0; i < s.size(); i++) {
r1[s[i]-'a']++;
}
for(int j = 0; j < t.size(); j++) {
r2[t[j]-'a']++;
}
// 判断 如果存在不相等
for(int i = 0; i < 26; i++) {
if(r1[i] != r2[i]) return false;
}
return true;
}
};
用时17min,卡在了一个低级错误,我最后判断部分遍历写成传入的两个字符串了。
349. 两个数组的交集
题目链接/文章讲解/视频讲解:代码随想录
// 结果中的每个元素是唯一的,考虑集合(存储一组不重复的元素)
unordered_set<int> r;
vector<int> res;
for(int i = 0; i < nums1.size(); i++) {
for(int j = 0; j < nums2.size(); j++) {
if(nums1[i] == nums2[j]) {
r.insert(nums1[i]);
}
}
}
for(int num : r) {
res.push_back(num);
}
return res;
}
用时18min,时间复杂度O(m*n)
刚开始我直接把返回类型改成set,但是系统要求的返回结果必须是数组
//将数组转换为set
unordered_set
<int>nums_set(
nums1
.begin(),
nums1
.end());
// 将集合转换为数组
vector<int>(result_set
.begin(),
result_set
.end())
// 结果中的每个元素是唯一的,考虑集合(存储一组不重复的元素)
unordered_set<int> res;
// 将数组转换为集合
unordered_set<int> nums(nums1.begin(), nums1.end());
// 范围for循环遍历数组2
for(int num: nums2) {
// 如果数组2中的数字能在集合中找到,则添加到集合中
if(nums.find(num) != nums.end()) {
res.insert(num);
}
}
// 将结果转换乘数组返回
return vector<int>(res.begin(), res.end());
}
时间复杂度O(n+m)
202. 快乐数
题目链接/文章讲解:代码随想录
重点在于,当sum!=1时,如何停止循环返回结果
所以一开始没有搞清楚为什么这道题也是set应用,就是利用set不能存储重复元素这一点。
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> nums;
// 设置标志位
int flag = 1;
while(flag) {
// 每次都要刷新,不刷新的话结果叠加永远大于1,且不能结束循环
int sum = 0;
// 处理多位数
while(n!=0){
sum += (n % 10)*(n % 10);
n = n / 10;
}
if(sum == 1) {
return true;
}
// 当sum是集合里已经出现过的元素说明开始循环了,此时标志位清0返回结果
if(nums.find(sum) != nums.end()) {
flag = 0;
}
nums.insert(sum);
// 重新给n赋值
n = sum;
}
return false;
}
};
用时35min 时间复杂度O((log n)^2)
1. 两数之和
题目链接/文章讲解/视频讲解:代码随想录
暴力解法时间复杂度O(n^2)
vector<int> twoSum(vector<int>& nums, int target) {
//unordered_map<int, int> mytarget;
vector<int> res(2,0);
//for(int i = 0; i < nums.size(); i++) {
//mytarget[i] = nums[i];
//}
for(int i = 0; i < nums.size();i++) {
for(int j = i+1; j < nums.size(); j++) {
int sum = nums[i] + nums[j];
if(sum != target) continue;
else {
res[0] = i;
res[1] = j;
return res;
}
}
}
return res;
}
这题用map映射的方法思路没有理清楚,还需要再看看
昨天休息日,理了一下数组和链表中的卡壳的地方,学习了时间复杂度的计算方法。