算法学习——LeetCode力扣哈希表篇1
- 互联网
- 2025-08-04 20:18:02

算法学习——LeetCode力扣哈希表篇1 242. 有效的字母异位词
242. 有效的字母异位词 - 力扣(LeetCode)
描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例示例 1:
输入: s = “anagram”, t = “nagaram” 输出: true
示例 2:
输入: s = “rat”, t = “car” 输出: false
提示1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母
进阶如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
代码解析 class Solution { public: bool isAnagram(string s, string t) { map<char ,int> my_map; for(int i=0 ; i<s.size() ;i++) my_map[s[i]]++; for(int i=0 ; i<t.size() ;i++) my_map[t[i]]--; for(auto it:my_map) if(it.second != 0) return false; return true; } }; 349. 两个数组的交集349. 两个数组的交集 - 力扣(LeetCode)
描述给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000 0 <= nums1[i], nums2[i] <= 1000
代码解析 数组哈希表建立两个1000大小数组,暴力映射进去。 消耗空间过大。
#include <iostream> #include<string> #include<vector> using namespace std; class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { vector<int>record1(1000, 0); vector<int>record2(1000, 0); for (int i = 0; i < nums1.size(); i++) { record1[nums1[i]]++; } for (int i = 0; i < nums2.size(); i++) { record2[nums2[i]]++; } vector<int>record3; for (int i = 0; i < 1000; i++) { if (record1[i] != 0 && record2[i] != 0) record3.push_back(i); } return record3; } }; int main() { vector<int> nums1 = { 4,9,5 }; vector<int> nums2 = { 9,4,9,8,4 }; Solution a; vector<int> nums3 = a.intersection(nums1, nums2); for(int i = 0 ;i<nums3.size();i++) cout <<nums3[i]<<' '; cout << endl; return 0; } set哈希表使用unordered_set进行哈希映射,统计数组出现的元素
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> result; unordered_set<int> set1(nums1.begin() , nums1.end()); for (int i = 0; i < nums2.size(); i++) { if (set1.find(nums2[i]) != set1.end()) { result.insert(nums2[i]); } } return vector<int>(result.begin(), result.end()); } }; C++11写法 auto关键字 class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> result; unordered_set<int> set1(nums1.begin() , nums1.end()); for (auto num : nums2) { if (set1.find(num) != set1.end()) { result.insert(num); } } return vector<int>(result.begin(), result.end()); } }; 202. 快乐数202. 快乐数 - 力扣(LeetCode)
描述编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。 示例示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
示例 2:
输入:n = 2 输出:false
提示1 <= n <= 231 - 1
代码解析 利用哈希表不停循环计算每位数字的sum。当sum等于1的时候返回成功。 每一次的sum都存入哈希表中,当某一个sum第二次出现,为进入死循环。 因此发现sum在哈希表里第二次出现,返回失败。
#include <iostream> #include<string> #include<vector> #include<set> #include <unordered_set> using namespace std; class Solution { public: bool isHappy(int n) { unordered_set<int> sum_set; int sum = 0; while (1) { if (n < 10) sum = n * n; else { while (n>=10) { sum = sum + (n % 10) * (n % 10); n = n / 10; } sum = sum + n * n; } if (sum == 1) return true; if (sum_set.find(sum) != sum_set.end()) return false; sum_set.insert(sum); cout << sum << endl; n = sum; sum = 0; } } }; int main() { Solution a; int n = 19; cout<< a.isHappy(n)<<endl; return 0; } 哈希法 class Solution { public: bool isHappy(int n) { string num_s; int sum=0; vector<int> tmp; while( find(tmp.begin() , tmp.end(),n) == tmp.end()) { cout<<n<<endl; tmp.push_back(n); num_s = to_string(n); for(int i=0 ; i<num_s.size();i++) { sum += pow( (int)(num_s[i]-'0'),2 ); } if(sum == 1 ) return true; else { n = sum; sum=0; } } return false; } }; 1. 两数之和1. 两数之和 - 力扣(LeetCode)
描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
提示 2 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109只会存在一个有效答案 进阶你可以想出一个时间复杂度小于 O(n2) 的算法吗?
代码解析 哈希表遍历一次数组,查看当前遍历的数组的值时候,map里面有无target - nums[i]。
如果没有,将当前遍历的数和下标组成pair存入map中。如果有,返回当前遍历数组值下标和map中找的的值下标。 #include <iostream> #include<vector> #include <unordered_map> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> num_map; for (int i = 0; i < nums.size(); i++) { auto iter = num_map.find(target - nums[i]); if (iter == num_map.end()) { num_map.insert(pair<int, int>(nums[i], i)); } else { return { (*iter).second , i}; } } } }; int main() { vector<int>nums = { 2,7,11,15 }; int target = 9; Solution a; vector<int>result = a.twoSum(nums , target); for (int i = 0; i < result.size(); i++) { cout << result[i] << ' '; } return 0; } 简要法 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int left , right; for(left = 0 ; left < nums.size() ;left++) { for(right = left + 1 ; right < nums.size() ; right++) { if( nums[right] + nums[left] == target ) return {left,right}; } } return {}; } };算法学习——LeetCode力扣哈希表篇1由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“算法学习——LeetCode力扣哈希表篇1”