今天,带来哈希表相关算法的讲解。文中不足错漏之处望请斧正!
出题者已经把题意明确告诉我们了:
怎么理解?
如果我们替换平方和的过程中, 发现当前的数字之前已经出现过, 那我们就陷入了无限循环.
如果没有把题意转化过来, 就会手足无措了.
那我们只需要不断重复替换平方和的过程, 再同时判断平方和之前是否出现过:
关于取十进制数上的每位, 可以再谈谈.
如, 要取1234中的每位数.
1234 % 10 = 4 //取到最后一位
1234 /= 10; //去掉最后一位
123 % 10 = 3 //取到倒数第二位
123 /= 10; //去掉最后一位
12 % 10 = 4 //取到倒数第三位
12 /= 10; //去掉最后一位
1 % 10 = 4 //取到倒数第四位
1 /= 10; //去掉最后一位
//最终1234变为0,结束
如果是二进制, 八进制, 只需要mod8即可.
class Solution {
public:
// 可能替换的过程可能一直循环:
// 如果当前得到的数之前已经得到过, 则会无限循环; 反之不会
bool isHappy(int n) {
unordered_set<int> appearedNum;
while (n != 1) {
int sum = getSqureSum(n);
// 只要当前的数之前没出现过, 就代表可能这个数能变到1
if (appearedNum.find(sum) == appearedNum.end()) {
appearedNum.insert(sum);
} else { // 反之不可能变到1
return false;
}
n = sum;
}
return true;
}
private:
int getSqureSum(int n) {
int sum = 0;
while (n) {
sum += pow(n % 10, 2);
n /= 10;
}
return sum;
}
};
*很好理解, 无需分析.
找到 x 和 y, 满足 x + y = target.
一层遍历获取 x, 查找nums内是否有这样的 y 满足 y = target - x.
关于查找:
查找某个元素在某个集合中是否用过, 这是哈希的绝活; 而且题目要求返回下标. 综合这两点, 我们用 unordered_map, 存储键值对的哈希表.
class Solution {
public:
// 找到 x 和 y, 满足 x + y = target
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> numsMap; //
// 一层遍历获取 x, 查找nums内是否有这样的 y 满足 y = target - x
for (int i = 0; i < nums.size(); ++i) {
int x = nums[i];
int y = target - x;
auto iter = numsMap.find(y);
if (iter != numsMap.end()) {
int i1 = i;
int i2 = iter->first;
return {i, iter->second};
} else {
numsMap.insert(pair<int, int>(nums[i], i));
}
}
return {};
}
};
今天的分享就到这里了,感谢您能看到这里。
这里是培根的blog,期待与你共同进步!