242.有效的字母异位词
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
思路
创建一个hash[],长度为26,0-25位分别对应26英文字母,初始值均为0。使用该数组对s中出现的字母进行统计,再次遍历t中字母,将hash数组中对应位置的数值进行减操作,如果两次操作之后,hash数组中每一个值均为0,则s、t为有效的字母异位词。
代码
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[26] = {0};//初始化为零
int i;
for(i = 0; i < s.size(); i++){
hash[s[i] - 'a']++;//对于出现的字母,按照对应下标位置,加一
}
for(i = 0; i < t.size(); i++){
hash[t[i] - 'a']--;//对于相同数组,对t中出现的字母,按照对应下标位置,减一
}
for(i = 0; i < 26; i++){
if(hash[i] != 0){
return false;//如果hash中有的位置上的值不为0,说明s跟t不为有效的字母异位词
}
}
return true;
}
};
349.两个数组的交集
题目描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路
使用set数据结构。 std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表,使用std::unordered_set读写效率最高,并不需要对数据进行排序。
代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int hash[1005] = {0};
unordered_set<int> res;
for(int i = 0; i < nums1.size(); i++){
hash[nums1[i]] = 1;
}
for(int i = 0; i <nums2.size(); i++){
if(hash[nums2[i]] == 1){
res.insert(nums2[i]);//使用set数据结构,可以去重
}
}
return vector<int>(res.begin(),res.end());
}
};
202.快乐数
题目描述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
思路
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了!!!! 题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现!!!!!! 关键--->判断sum是否会重复出现!----> unordered_set
代码
class Solution {
public:
//创建平方和函数
int getSum(int n){
int sum = 0;
while(n){
int m = n % 10;
sum += m * m;
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;
while(1){
n = getSum(n);
//判断最终加和是否为1
if(n == 1)
return true;
//将n加入到set数据结构中,判断,如果曾经出现过相同的数字,则会无限循环
if(set.find(n) != set.end())
return false;
else
set.insert(n);
}
}
};
1.两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
思路
1、暴力解法,双层for循环 2、用一个集合存放遍历过的元素,在遍历数组的时候询问这个集合,该元素是否出现过----> 哈希表 本题--> 不仅要知道元素是否遍历过,还要知道元素下标,需要使用key value 结构来存放,key存元素,value下标---使用map。map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。
代码
暴力解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
for(int j = 0; j < nums.size(); j++){
if(j == i) continue;
else{
if(nums[i] + nums[j] == target){
return {i, j};
}
}
}
}
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++){
//map中查找
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 {};
}
};