代码随想录算法训练营day6|242.有效的字母异位词、349.两个数组的交集、202.快乐数

发布时间:2024年01月04日
?哈希表理论基础?

建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set?和map。??

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。??这句话很重要,大家在做哈希表题目都要思考这句话。?

文章讲解:代码随想录

?242.有效的字母异位词?

建议:?这道题目,大家可以感受到?数组?用来做哈希表?给我们带来的遍历之处。?

题目链接/文章讲解/视频讲解:?代码随想录

?349.?两个数组的交集?

建议:本题就开始考虑?什么时候用set?什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和?测试用例,添加了?0?<=?nums1[i],?nums2[i]?<=?1000?条件,所以使用数组也可以了,不过建议大家忽略这个条件。?尝试去使用set。?

题目链接/文章讲解/视频讲解:代码随想录

?202.?快乐数?

建议:这道题目也是set的应用,其实和上一题差不多,就是?套在快乐数一个壳子?

题目链接/文章讲解:代码随想录

?1.?两数之和?

建议:本题虽然是?力扣第一题,但是还是挺难的,也是?代码随想录中?数组,set之后,使用map解决哈希问题的第一题。?

建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。?

题目链接/文章讲解/视频讲解:代码随想录


? ? ? ? 使用哈希法,用数组来做哈希表。字符为key,建立key与index的映射,然后value为key出现的次数。

映射关系index=key-‘a’。

c++代码示例如下时间复杂度O(n)、空间复杂度O(1)

bool isAnagram(string s, string t) {
	int record[26] = { 0 };
	for (int i = 0; i < s.size(); i++) {
		record[s[i] - 'a']++;
	}
	for (int i = 0; i < t.size(); i++) {
		record[t[i] - 'a']--;
	}
	for (int i = 0; i < 26; i++) {
		if (record[i] != 0) {
			return false;
		}
	}
	return true;
}

? ? ? ? 输出结果中每一个元素都是唯一的,我们使用unordered_set来接受结果,对于unordered_set的初始化可以使用迭代器初始化。

c++代码示例如下? ? ? ? 时间复杂度O(n+m),空间复杂度O(n)

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
	unordered_set<int> result;
	unordered_set<int> nums_set(nums1.begin(), nums1.end());
	for (int num : nums2) {
		if (nums_set.find(num) != nums_set.end()) {
			result.insert(num);
		}
	}
	return vector<int>(result.begin(), result.end());
}

? ? ? ? 发现题目给的数据的大小0<=nums1[i],nums2[i]<=1000,可以使用大小为1001的数组来做哈希表,数字作为key->index,出现次数为value。还是用unordered_set来接受结果。

c++代码示例如下

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
	unordered_set<int> result;
	int hash[1001] = { 0 };
	for (int num : nums1) {
		hash[num] = 1;
	}
	for (int num : nums2) {
		if (hash[num] == 1) {
			result.insert(num);
		}
	}
	return vector<int>(result.begin(), result.end());
}

? ? ? ? 难点就是意识到无限循环就是sum重复出现

c++代码示例如下

int getSum(int n) {
	int sum = 0;
	while (n) {
		sum += (n % 10) * (n % 10);
		n /= 10;
	}
	return sum;
}
bool isHappy(int n) {
	unordered_set<int> set;
	while (1) {
		int sum = getSum(n);
		if (sum == 1) {
			return true;
		}
		if (set.find(sum) != set.end()) {
			return false;
		}
		else {
			set.insert(sum);
		}
		n = sum;
	}
}
文章来源:https://blog.csdn.net/2302_79277225/article/details/135391251
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。