代码随想录算法训练营day06|242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和
242.有效的字母异位词
题目链接:https://leetcode.cn/problems/valid-anagram/description/
我的代码:
class Solution { public: bool isAnagram(string s, string t) { if (s.size() == t.size()) { int record[26] = {0}; for (int i = 0; i < s.size(); i++) { record[s[i] - 'a']++; record[t[i] - 'a']--; } for (int i = 0; i < 26; i++) { if (record[i] != 0) return false; } return true; } else return false; } };
先比较两字符串长度,长度相同则定义一个数组哈希表,索引值就是字母对于‘a’的相对位置,s遇字母加1,t遇字母减1,若循环结束后哈希数组内值全为0则说明两字符串是字母异位词。
349.两个数组的交集
题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/description/
使用set:
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> result; unordered_set<int> nums(nums1.begin(), nums1.end()); for (int num : nums2) { if (nums.find(num) != nums.end()) { // 在nums中查找num值,返回一个迭代器,如果找到,迭代器指向该元素,没有找到,迭代器指向nums.end() result.insert(num); } } return vector<int>(result.begin(), result.end()); } };
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
在nums1的set中查找到num2元素则加入result,返回result为两数组交集,其中unordered_set
使用数组:
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { int hash[1005] = {0}; for (int i = 0; i < nums1.size(); i++) { hash[nums1[i]] = 1; } unordered_set<int> result; for (int i = 0; i < nums2.size(); i++) { if (hash[nums2[i]] == 1) result.insert(nums2[i]); } return vector<int>(result.begin(), result.end()); } };
定义哈希数组,全部置0,遍历nums1,给索引置1,遍历nums2,检索到哈希数组元素为1,插入result,其中unordered_set
202.快乐数
题目链接:https://leetcode.cn/problems/happy-number/description/
我的代码:
class Solution { public: int getSum(int n) { // 求各位数字平方和的函数 int sum = 0; while (n) { sum += (n % 10) * (n % 10); n = n / 10; } return sum; } bool isHappy(int n) { unordered_set<int> record; while (1) { int sum = getSum(n); if (sum == 1) { return true; } else if (record.find(sum) != record.end()) { return false; } else { record.insert(sum); } n = sum; } } };
此题关键在于判断sum是否重复出现,若出现1,则return true,若重复出现,则出现无限循环,直接return false,同时对求各位数字平方和的函数也要熟练。
1.两数之和
题目链接:https://leetcode.cn/problems/two-sum/description/
我的代码:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> record; for (int i = 0; i < nums.size(); i++) { auto iter = record.find(target - nums[i]); if (iter != record.end()) { return {i, iter->second}; } record.insert(pair<int, int>(nums[i], i)); } return {}; } };
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树,这道题目中并不需要key有序,选择std::unordered_map 效率更高。
检索map中是否有target - nums[i]的key值,若有则返回两下标,没有则将(nums[i],i)加入map。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!