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

相关推荐
威嵌神州6 小时前
国产化加固计算机项目选型笔记|板卡、整机、平板与定制模块评估要点
笔记·fpga开发·电脑
阿梦Anmory6 小时前
规划领域定义语言(PDDL)学习笔记
笔记·学习
开开心心就好6 小时前
白天晚上自动调蓝光,护眼工具亮度可调
服务器·开发语言·算法·pdf·ocr·intellij-idea·idea
绛橘色的日落(。・∀・)ノ6 小时前
C#学习笔记
笔记·学习·c#
ss2736 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql
云水初7 小时前
【项目篇】基于LanGraph的自动处理客服邮件的 Agent汇总
开发语言·笔记·python·学习·fastapi·langgraph
Jsundoku7 小时前
第六章 机器学习 -- 支持向量机
算法·机器学习·支持向量机
?abc!7 小时前
(数组)448. 找到所有数组中消失的数字
算法
淡海水7 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc