刷题笔记:力扣第242、349题(哈希表)

力扣第242题-有效的字母异位词

1.本题考点为哈希表,比较容易想到,完整代码如下:

cpp 复制代码
 1. bool isAnagram(char* s, char* t) {
 2.     // 创建26个字母的计数数组,初始全0
 3.     int hash[26] = {0};
 4.     // 获取两个字符串长度
 5.     int len1 = strlen(s), len2 = strlen(t);
 6.     // 长度不同一定不是字母异位词,直接返回false
 7.     if (len1 != len2) return false;
 8.  
 9.     // 遍历s,对应字母计数+1
10.     for (int i = 0; i < len1; i++){
11.         hash[s[i] - 'a']++;
12.     }
13.     // 遍历t,对应字母计数-1
14.     for (int i = 0; i < len2; i++){
15.         hash[t[i] - 'a']--;
16.         // 某个字母负数,说明t该字母更多,直接false
17.         if (hash[t[i] - 'a'] < 0) return false;
18.     }
19.  
20.     // 全部抵消完毕,是字母异位词
21.     return true;
22. }

该算法时间复杂度为O(n),空间复杂度为O(1)。

力扣第349题-两个数组的交集

1.本题也是考察哈希表,只需要为两个数组各创建一个哈希数组,记录哪些数字出现了,最后在对比两个哈希数组即可。完整代码如下:

cpp 复制代码
 1. int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
 2.     // 哈希数组,题目数据范围0~1000,分别记录两个数组数字出现标记
 3.     int hash1[1001] = {0};
 4.     int hash2[1001] = {0};
 5.     // cnt记录交集元素个数
 6.     int cnt = 0;
 7.     // 分配结果数组,最多存1001个不同数字
 8.     int* res = (int*)malloc(sizeof(int) * 1001);
 9.  
10.     // 遍历nums1,标记出现过的数字
11.     for (int i = 0; i < nums1Size; i++){
12.         hash1[nums1[i]]++;
13.     }
14.     // 遍历nums2,标记出现过的数字
15.     for (int i = 0; i < nums2Size; i++){
16.         hash2[nums2[i]]++;
17.     }
18.     // 遍历0~1000全部数字,两边都出现过则加入交集
19.     for (int i = 0; i < 1001; i++){
20.         if (hash1[i] > 0 && hash2[i] > 0){
21.             res[cnt++] = i;
22.         }
23.     }
24.  
25.     // 设置返回数组长度
26.     *returnSize = cnt;
27.     return res;
28. }

该算法时间复杂度为O(m + n),空间复杂度为O(1)(常数空间的哈希数组)。

2.还可以做进一步优化,两个哈希数组合并为一个,结果数组的开辟空间大小设定为两个数组大小的较小值。完整代码如下:

cpp 复制代码
 1. int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
 2.     // 哈希数组,数值范围0~1000,标记nums1中出现过的数字
 3.     int hash[1001] = {0};
 4.     // 统计交集元素数量
 5.     int cnt = 0;
 6.     // 交集最多元素个数等于较短数组长度,以此分配结果数组内存
 7.     int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
 8.     int* res = (int*)malloc(sizeof(int) * lessSize);
 9.  
10.     // 遍历nums1,仅将首次出现的数字标记为1,去重
11.     for (int i = 0; i < nums1Size; i++){
12.         if (hash[nums1[i]] == 0){
13.             hash[nums1[i]]++;
14.         }
15.     }
16.     // 遍历nums2,找到哈希表中标记过的数字,即为交集
17.     for (int i = 0; i < nums2Size; i++){
18.         if (hash[nums2[i]] > 0){
19.             res[cnt++] = nums2[i];
20.             hash[nums2[i]]--; // 减1避免重复存入相同元素
21.         }
22.     }
23.  
24.     // 赋值返回数组有效长度
25.     *returnSize = cnt;
26.     return res;
27. }

该算法时间复杂度为O(m + n),空间复杂度为O(1)(常数空间的哈希数组)。

相关推荐
一米阳光86611 小时前
软考高级【信息系统项目管理师】高项重要考点(3)高级项目管理-下 助你顺利上岸!
笔记·职场发展·软考·信息系统项目管理师·高级职称
hqyjzsb1 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye1 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术1 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
dianziyao_2 小时前
第 4.1 篇:让 Codex 理解你的双链——AI 辅助发现笔记间的关联
人工智能·笔记
sanjiaomao3332 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息2 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
大圣编蚕3 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界4 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光4 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生