242.有效的字母异位词
文章讲解:代码随想录
视频讲解:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili
题目链接:. - 力扣(LeetCode)
解题思路:
1.定义一个26大小的int数组,三次循环,第一次循环将第一个字符串中每个字母出现的次数都记录进去,第二次循环遍历第二个字符串每个字母,在数组中减去对应次数,第三次循环判断数组元素是否均为0,若为0,则是有效字母异位词,否则不是。
- 时间复杂度: O(n)
- 空间复杂度: O(1)
关键点:
1.哈希表数组用法经度题目。
c++代码:
class Solution
{
public:
bool isAnagram(string s, string t)
{
int hash[26] = {0};
for(int i=0;i<s.size();i++)
{
hash[s[i] - 'a']++;
}
for(int i=0;i<t.size();i++)
{
hash[t[i] - 'a']--;
}
for(int i=0;i<(sizeof(hash)/sizeof(hash[0]));i++)
{
if(hash[i] != 0)
{
return false;
}
}
return true;
}
};
349.两个数组的交集
文章讲解:代码随想录
视频讲解:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili
题目链接:. - 力扣(LeetCode)
解题思路:
1.和上一题判断是否是有效字母异位词解题思路大致,先把一个数组放入一个合适容器,再遍历另一个数组与容器里的值一一对应判断。
- 时间复杂度: O(n + m) m 是最后要把 set转成vector
- 空间复杂度: O(n)
关键点:
1.选用合适的数据结构,此题可用数组和set。最合适的是set,unordered_set容器自带去重。
c++代码:
class Solution
{
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
unordered_set<int> result_set;
unordered_set<int> u_set(nums1.begin(),nums1.end());
for(int num:nums2)
{
if(u_set.find(num) != u_set.end())
{
result_set.insert(num);
}
}
return vector<int>(result_set.begin(),result_set.end());
}
};
202.快乐数
文章讲解:代码随想录
视频讲解:无
题目链接:. - 力扣(LeetCode)
解题思路:
1.首先要得到输入的整数n各位置数字的平方相加的和sum,然后再while(1)无限循环中判断sum是否为1,不为1,不为1进入set的if判断,如果这个sum不在set容器中出现过,把这个数插入到set容器中,否则表明sum在set容器中出现过,那么说明这个数按快乐数的计数规则会陷入循环中且不为1,返回false;
- 时间复杂度: O(logn)
- 空间复杂度: O(logn)
关键点:
1.关键在于题目中所说“然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1”。从这句话中推导得到只要不出现无限循环情况就一定能变到1。此时就可以用while(1)无限循环取判断。
2.举例说明会陷入循环的一些数。如2,每一次计数后的值分别为4 16 37 58 89 145 42 20 4,在第9次时,会重新变为4,即进入循环。
c++代码:
class Solution
{
public:
int get(int n)
{
int sum = 0;
while(n)
{
sum += (n%10) * (n%10);
n = n/10;
}
return sum;
}
bool isHappy(int n)
{
unordered_set<int> set;
while(1)
{
int sum = get(n);
if(sum == 1) return true;
if(set.find(sum) != set.end())
{
return false;
}
else
{
set.insert(sum);
}
n = sum;
}
}
};
1.两数之和
文章讲解:代码随想录
视频讲解:梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili
题目链接:. - 力扣(LeetCode)
解题思路:
1.一次遍历,每次对元素nums[i]进行判断,如果target-nums[i]不在map容器中,把nums[i]放入map中,判断下一个位置元素,反正target-nums[i]在map中,则找到了相加等于target的两个值。返回对应下标
- 时间复杂度: O(n)
- 空间复杂度: O(n)
关键点:
1.map容器第一个位置存放元素,第二个位置存放的才是元素下标。
c++代码:
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 iter = map.find( target - nums[i] );
if(iter != map.end())
{
return {iter->second,i};
}
map.insert(pair<int,int>(nums[i],i));
}
return {};
}
};