前言
跟着英雄哥打卡第三十九天
[专题跳转->《算法零基础100讲》]
[万人千题社区跳转]
一、有效的字母异位词
跳转力扣:242. 有效的字母异位词
难度:★☆☆☆☆
说明:哈希表,将 s s s 和 t t t 存入哈希表,依次遍历判断对应值是否相同
代码如下(示例):
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size()) return false;
unordered_map<char, int> ms, mt;
for (int i = 0; i < s.size(); i ++) {
ms[s[i]] ++;
mt[t[i]] ++;
}
for (int i = 0; i < s.size(); i ++) {
if (ms[s[i]] != mt[s[i]])
return false;
}
return true;
}
};
二、数组中的第K个最大元素
跳转力扣:215. 数组中的第K个最大元素
难度:★☆☆☆☆
说明:小根堆,将所有数放入堆中,当堆内数大于 k k k 时,弹出堆顶元素,最后的堆顶元素则为第 k k k 大的数
代码如下(示例):
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int, vector<int>, greater<int>> q;
for(int i = 0; i < nums.size(); i++)
{
q.push(nums[i]);
if(q.size() > k)
q.pop();
}
return q.top();
}
};
三、丢失的数字
跳转力扣:268. 丢失的数字
难度:★☆☆☆☆
说明:哈希集合,将所有值存入哈希集合,遍历数组,若集合内不存在该值,则为答案所求
代码如下(示例):
class Solution {
public:
int missingNumber(vector<int>& nums) {
unordered_set<int> set;
int n = nums.size();
for (int i = 0; i < n; i++) {
set.insert(nums[i]);
}
int missing;
for (int i = 0; i <= n; i++) {
if (!set.count(i)) {
missing = i;
break;
}
}
return missing;
}
};
四、找不同
跳转力扣:389. 找不同
难度:★☆☆☆☆
说明:哈希表,先将原字符串每个字符存入哈希表 m s ms ms 中,再将增加一个字符后的字符串中每个字符存入另一个哈希表 m t mt mt ,若出现 m t [ c ] > m s [ c ] mt[c] > ms[c] mt[c]>ms[c],表示找到增加的那一个字符,则 c c c 为答案所求
代码如下(示例):
class Solution {
public:
char findTheDifference(string s, string t) {
unordered_map<char, int> ms, mt;
for (auto &c: s) ms[c] ++;
for (auto &c: t) {
mt[c] ++;
if (mt[c] > ms[c])
return c;
}
return ' ';
}
};
五、错误的集合
跳转力扣:645. 错误的集合
难度:★☆☆☆☆
说明:哈希表,将数组所有值存入哈希表中,哈希表一定存在数组中对应哈希值为 2 2 2 和 0 0 0 ,遍历即可找到答案
代码如下(示例):
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
vector<int> ans(2);
unordered_map<int, int> ms;
for (auto &n: nums) {
ms[n] ++;
}
for (int i = 1; i <= nums.size(); i ++) {
if (ms[i] == 2){
ans[0] = i;
}
else if (ms[i] == 0) {
ans[1] = i;
}
}
return ans;
}
};