最近准备六级和考试,时间好紧啊啊。。
每道题的方法:
最后总结写
题目一链接:242. 有效的字母异位词 - 力扣(LeetCode)
思路:哈希法中的数组类型:利用小写字母只有26的性质,创建一个大小为26的数组存字符。
代码:
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 i = 0;i < t.size();i ++) {
record[t[i] - 'a'] --;
}
for(int i = 0;i < 26;i ++) {
if(record[i] != 0) return false;
}
return true;
}
};
难点:
题目二链接:349. 两个数组的交集 - 力扣(LeetCode)
思路:先确定用unordered_set集合,然后其中一个数组转化为unorded_set,然后通过一个for循环和unordered_set的find()函数来寻找相同的元素,存入到另一个unordered_set里面,最后输出
代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;//定义一个存放结果的集合,且方便去重
unordered_set<int> nums_set(nums1.begin(),nums1.end());//对nums1进行了去重操作
for(int num:nums2) {
if(nums_set.find(num) != nums_set.end()) {
result_set.insert(num);//自动去重
}
}
return vector<int> (result_set.begin(),result_set.end());
}
};
难点:
补充细节:unordered_set可以自动去重
题目三链接:202. 快乐数 - 力扣(LeetCode)
思路:根据题意得出如果此数不是快乐数,则他会发生无限循环,即某个数重复出现,否则某个数的每一位的平方(用get_sum求)等于1。因此需要快速判断某个元素是否存在在某个集合里时,用哈希法。
代码:
class Solution {
public:
int get_sum(int n) {
int res = 0;
while(n) {
int i = n % 10;
n /= 10;
res += i * i;
}
return res;
}
bool isHappy(int n) {
unordered_set<int> set;
while(1) {
int sum = get_sum(n);
if(sum == 1) return true;
else {
if(set.find(sum) != set.end()) {
return false;
}
else {
set.insert(sum);
}
}
n = sum;
}
}
};
难点:
题目四链接:1. 两数之和 - 力扣(LeetCode)
思路:此题需要找某个值是否存在在数组中,所以想着用哈希表,又因为需要记录数值和下标,所以需要用map,因为不需要排序,所以需要用unordered_map。然后从第一个数开始便利,找到目标值就return下标,否则把元素存入map.
代码:
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 ++) {
//这里的half也应该是unordered_map类型
auto half = map.find(target - nums[i]);//需要判断元素是否出现的这个元素,作为key,另一个作为value
if(half != map.end()) {
return {half -> second,i};
}
else{
//最后插入
map.insert(pair<int,int> (nums[i],i));
}
}
return {};
}
};
难点: