代码随想录算法训练营第5天|242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
242. 有效的字母异位词
提交代码(哈希表,用长度26的数组保存每个字母出现次数)
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> vec(26, 0);
for(int i = 0; i < s.size(); i++)
vec[s.at(i) - 'a']++;
for(int i = 0; i < t.size(); i++)
vec[t.at(i) - 'a']--;
for(int i = 0; i < 26; i++)
{
if(vec[i] != 0)
return false;
}
return true;
}
};
解答代码(方法1-排序)
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
解答代码(方法2-哈希表)
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
vector<int> table(26, 0);
for (auto& ch: s) {
table[ch - 'a']++;
}
for (auto& ch: t) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}
};
349. 两个数组的交集
提交代码(方法)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set;
unordered_set<int> result;
for(int i = 0; i < nums1.size(); i++)
{
if(set.count(nums1[i]) == 0)
set.insert(nums1[i]);
}
for(int i = 0; i < nums2.size(); i++)
{
if(set.find(nums2[i]) != set.end())
result.insert(nums2[i]);
}
return vector<int>(result.begin(), result.end());
}
};
解答代码(方法)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int length1 = nums1.size(), length2 = nums2.size();
int index1 = 0, index2 = 0;
vector<int> intersection;
while (index1 < length1 && index2 < length2) {
int num1 = nums1[index1], num2 = nums2[index2];
if (num1 == num2) {
// 保证加入元素的唯一性
if (!intersection.size() || num1 != intersection.back()) {
intersection.push_back(num1);
}
index1++;
index2++;
} else if (num1 < num2) {
index1++;
} else {
index2++;
}
}
return intersection;
}
};
202. 快乐数
提交代码(方法)
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> set;
while(true)
{
int curRes = 0;
while(n > 0)
{
int bit = n % 10;
n = n / 10;
curRes += bit * bit;
}
if(curRes == 1)
return true;
if(set.count(curRes))
break;
n = curRes;
set.insert(curRes);
}
return false;
}
};
解答代码(方法)
在这里插入代码片
1. 两数之和
提交代码(方法)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
auto it = map.find(target - nums[i]);
if (it != map.end()) {
return {
it->second, i};
}
map[nums[i]] = i;
}
return {
};
}
};
解答代码(方法)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {
it->second, i};
}
hashtable[nums[i]] = i;
}
return {
};
}
};
总结
日期: 2023 年 3 月 20 日
学习时长: 1 h 30 m
难度: ★ \bigstar ★
累计完成题目数量: 16
距离目标还有数量: 284
小结:
- 对于哈希表,解答中的方法在最开始判断两个字符串长度是否相等,如果不相等则直接为false,这个我没有判断。同时,在字符串长度相等的前提下,如果第二次有出现 <0 的情况直接返回false就可以了。
- 关于第二个问题,unordered_set是具有唯一性的,也就是插入两个相同元素的时候,返回的count值是1,而不是2。可以使用find()函数与end()做比较来判断元素是否出现过。
- 关于第三个问题,三个方法只看了第一种方法,利用哈希表,剩下的方法今天先不看了,总的来说就是,要么陷入循环,要么得到1。