文章目录
一、哈希表
二、242.有效的字母异位词
1.题目
2.解题思路
注意:数组就是简单的哈希表,但是数组的大小可不是无限开辟的
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i =0;i<s.size();i++){
record[s[i] - 'a']++;
}
for(int j = 0;j<t.size();j++){
record[t[j] - 'a']--;
}
for(int k = 0;k<26;k++){
if(record[k] != 0){
return false;
}
}
return true;
}
};
三、349. 两个数组的交集
1.题目
2.解题思路
注意:如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费!
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//无重复元素
unordered_set<int> result;
//unordered_set<int> nums_set(nums1.begin(), nums1.end());
//vector<int> result;
int num[1001] = {0};
for(int i = 0;i<nums1.size();i++){
num[nums1[i] - 0]++;
}
for(int j = 0;j<nums2.size();j++){
if(num[nums2[j] - 0] != 0){
result.insert(nums2[j]);
}
}
return vector<int>(result.begin(), result.end());
}
};
四、202. 快乐数
1.题目
2.解题思路
class Solution {
public:
//
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;
}
// 如果sum曾出现过,说明已经陷入了无限循环
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
五、1. 两数之和
1.题目
2.解题思路
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
总结
day6打卡!