刷题笔记:力扣第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)(常数空间的哈希数组)。

相关推荐
无聊的菜鸟31 分钟前
TMS320F2806X学习笔记(一)—— 了解片上资源
笔记·ti·c2000·f2806x
带多刺的玫瑰1 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王2 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes2 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent
优化Henry2 小时前
学习笔记之爱立信站点指向证书执行
运维·服务器·网络·笔记·学习·信息与通信
阿无,2 小时前
布隆过滤器
java·算法·哈希算法
徒慕风流2 小时前
激光雷达回波信号滤波与时刻鉴别算法:原理、代码实现与仿真验证
python·算法·激光雷达
这料鬼有毒2 小时前
二刷hot100-70.爬楼梯
算法
CIO_Alliance3 小时前
AI算法系列(2)| 决策树与随机森林XGBoost:企业AI化转型中的树模型选型逻辑
大数据·人工智能·算法·决策树·系统集成·企业cio联盟·企业级ai化转型
ZC跨境爬虫3 小时前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode