day6
242.有效的字母异位词
题目链接:242.有效的字母异位词
解题思路:利用哈希表的方法,本题将数组作为哈希表,里面有几个细节注意:首先就是数组的赋值,初始要将值赋为0,然后分别遍历两个字符串,将其在数组中的位置对应值进行相应的加或者减操作,最终判断数组中的元素是否都为0,如果为0返回true
,否则返回false
。
class Solution {
public:
bool isAnagram(string s, string t) {
int hash1[26] = {0};
// for( int i = 0; i < 26; i++){
// cout<<hash1[i]<<endl;
// }
for( int i = 0;i < s.size();i++){
// 并不用记住字符a的值,有相对数值即可
hash1[ s[i]-'a' ]++;
}
for ( int i = 0;i < t.size();i++){
hash1[ t[i]-'a']--;
}
// cout<<*hash<<endl;
for ( int i = 0; i < 26; i++){
// cout<<i<<endl;
// cout<<hash1[i]<<endl;
if ( hash1[i] != 0 ){
return false;
}
}
return true;
}
};
349.两个数组的交集
题目链接:349.两个数组的交集
题目思路:
1.利用数组作为哈希表,由于力扣上限制了数值的范围,因此利用数组作为哈希表,先遍历第一个数组将其对应位置的值进行更新,然后遍历第二个数组看是否在哈希表中出现过。注意对于集合的定义
unordered_set<int> result; result.insert(nums2[i]); // 最后将集合转换为数组 vector<int>(result.begin(),result.end());
2.利用set作为哈希表,先将第一个nums存入set哈希表中,注意存入方式。
unordered_set<int> nums_set(nums1.begin(),nums1.end()); // 判断是否出现过条件 nums_set.find(num) != nums_set.end()
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// //1. 数组哈希表写法
// int hash_map[1001]={0};
// unordered_set<int> result;
// for ( int i = 0;i < nums1.size();i++){
// hash_map[ nums1[i] ]++;
// }
// for ( int i = 0;i < nums2.size();i++){
// if( hash_map[ nums2[i] ] != 0 ){
// result.insert(nums2[i]);
// }
// }
// return vector<int>(result.begin(),result.end());
// 2.set哈希表的解法
unordered_set<int> result_set; //存放结果,用set来去重
unordered_set<int> nums_set(nums1.begin(),nums1.end());
for(int num:nums2){
//查看nums2的元素是否在nums_set里面出现过
if( nums_set.find(num) != nums_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(),result_set.end());
}
};
202.快乐数
题目链接:202.快乐数
题目思路:本质是一个哈希表的题目,首先应该知道如何计算n的各个位上的平方和,其次判断sum是否为1,如果为1,返回true
,如果有重复元素,则返回false
。
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;
}
// 如果重复出现过,直接return false 说明陷入了循环
if(set.find(sum)!=set.end()){ //注意判断条件
return false;
}
else{
set.insert(sum);
}
n=sum;
}
}
};
1.两数之和
题目链接:1.两数之和
题目思路:通过哈希表将列表中的数值存进去,每遍历一个数,判断target-该数是否在之前的哈希表中出现过,如果出现过,则直接返回位置,没有出现过就将该数插入哈希表中,如果都不满足返回空
// 注意哈希表中的map在C++的写法
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++){
//判断目标值-nums[i]是否在map中
int t = target - nums[i];
auto iter = map.find(t);
if( map.find(t) != map.end()){
return { iter->second,i};
}
//如果没有匹配到,将元素加入到map中
map.insert(pair<int,int>(nums[i],i));
}
return {};
}
};