状态:字母表哈希数组AC。
暴力法没什么好说的,哈希数组思路进行三次遍历即可,空间换时间,也没什么好说的,时间复杂度,空间复杂度。
状态:初见考虑使用的是unordred_map,没有仔细读题,后续查看题解后使用unordered_set,但在最终返回时处理有误。
set的一个好处是可以去重复,但是如果题目中的数值没有特别大,还是用哈希数组来解决更为高效,因为set中的hash计算也有时间。这道题中对set和vector赋值的操作以及哈希数组和set的优缺点分析值得仔细回味。时间复杂度,空间复杂度。set代码如下:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
哈希数组的代码:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
int hash[1005] = {0}; // 默认数值为0
for (int num : nums1) { // nums1中出现的字母在hash数组中做记录
hash[num] = 1;
}
for (int num : nums2) { // nums2中出现话,result记录
if (hash[num] == 1) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
状态:初见没有思路,对各位数的获取存在畏难情绪。
这道题总体思路上最关键的就是发现什么情况下可以判断一个数「不是」快乐数。典型的难者不会会者不难。当我们在不断计算平方和的过程中,一旦平方和已经出现过一次,就意味着之后会陷入无限循环,可以判断「不是」快乐数。时间复杂度,空间复杂度,(这里对复杂度的分析要好好推演)。代码如下:
//获取各位上的单数之和
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> record;
while(1){
int sum = getSum(n);
if(sum == 1){
return true;
}
if(record.find(sum) != record.end()){
//已经出现过,之后会无限循环
return false;
}else{
record.insert(sum);
}
n = sum;
}
}
状态:想到了利用unordered_map来解决,但是返回成vector时的格式出现了错误。
思路没什么好说的,和哈希数组一样,但是考虑到值很大,采用map来实现。需要注意的是返回为vector时格式为{x, y},在给map插入新元素时直接map[i] = j即可。
哈希表中的一些注意:hash_set/map和unordered_set/map的区别:一个是官方认证一个是民间实现,在技术上没有区别。multi_set/map的底层实现是红黑树,因此查询/增删效率为,unordered_set/map的底层实现是哈希表/桶(开链法解决碰撞),查询/增删效率为。