![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LC哈希
hash
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 750. 角矩形的数量 (枚举、哈希表)
750. 角矩形的数量 关键是如何枚举矩形。 暴力枚举就是分别枚举矩形的两个角,时间复杂度:O(n4)O(n^4)O(n4) 下面的做法,依次考虑每增加的一行对答案的贡献。 具体来说, 如果上面已经在 3 行在列索引为1,9出现, 那么现在这一行也在列索引1,9出现,那么对答案贡献了 3 次。 class Solution { public: int countCornerRectangles(vector<vector<int>>& grid) {原创 2021-06-12 23:08:27 · 165 阅读 · 0 评论 -
LeetCode 525. 连续数组 (哈希表、前缀和)
525. 连续数组 子数组的很多题目都可以这么操作,老套路题了。 const int N = 100010; class Solution { int id(int x) { return x + N; } public: int findMaxLength(vector<int>& nums) { int n = nums.size(), ans = 0; int f[2*N]; memset(f,原创 2021-06-05 16:06:59 · 67 阅读 · 0 评论 -
LeetCode 1074. 元素和为目标值的子矩阵数量 (二维转成一维数组前缀和 + 哈希表 )
一维数组前缀和 + 哈希表 时间复杂度:O(m2∗n)O(m^2*n)O(m2∗n) class Solution { public: int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) { int ans = 0; int m = matrix.size(), n = matrix[0].size(); for(int m1 = 0; m原创 2021-05-29 00:44:37 · 79 阅读 · 0 评论 -
LeetCode 1442. 形成两个异或相等数组的三元组数目(异或、前缀、哈希表)
1442. 形成两个异或相等数组的三元组数目 a==ba == ba==b 转换为 (s[i]==s[k+1])(s[i] == s[k+1])(s[i]==s[k+1]) s 代表异或的“前缀和”。 class Solution { public: int countTriplets(vector<int>& arr) { int ans = 0; int n = arr.size(); vector<int> s(n原创 2021-05-18 16:52:24 · 59 阅读 · 0 评论 -
LeetCode 220. 存在重复元素 III (T3reeMap、桶排序)
220. 存在重复元素 III 自己写的感觉有点不论不类的感觉。 class Solution { public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { int len = nums.length; if (len < 2) return false; k = Math.min(k, len); TreeMap<Integer, In原创 2021-04-18 19:07:58 · 83 阅读 · 0 评论 -
LeetCode 1178. 猜字谜 (位运算、枚举子集、哈希表)
1178. 猜字谜 class Solution { public: vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) { vector<int> ans; map<int,int> mp; for(auto& s:words){ mp[原创 2021-02-26 05:30:51 · 230 阅读 · 0 评论 -
LeetCode 1722. 执行交换操作后的最小汉明距离 ( 并查集 + 哈希表(排序+双指针)) )
1722. 执行交换操作后的最小汉明距离 思路: 并查集合并联通分量 统计每个联通分量的不同的数字的个数 class UnionFind { int[] f; int N; public UnionFind(int n) { N = n+10; f = new int[N]; for(int i=0;i<N;i++) f[i] = i; } public UnionFind() { thi原创 2021-02-01 16:34:11 · 117 阅读 · 0 评论 -
LeetCode 888. 公平的糖果棒交换
公平的糖果棒交换 class Solution { public int[] fairCandySwap(int[] A, int[] B) { boolean[] vis = new boolean[200100]; int sum = 0,sumA = 0; for(int x:A) { sum += x; sumA += x; } for(int x:B) {原创 2021-02-01 01:11:03 · 109 阅读 · 0 评论 -
LeetCode 523. 连续的子数组和 (哈希表、前缀和、同余)
523. 连续的子数组和 力扣类似这样的题目实在是不少, 子串使用前缀和的思想,为了记录,使用unordered_mao。 class Solution { public: bool checkSubarraySum(vector<int>& a, int k) { if(k==0){ int t = 0; for(int i=0;i<a.size();i++){ if(a[i]原创 2020-10-11 01:20:34 · 84 阅读 · 0 评论 -
LeetCode 560. 和为K的子数组 974.和可被 K 整除的子数组 (Hash表、前缀和)
添加链接描述 添加链接描述原创 2020-08-13 16:09:48 · 150 阅读 · 0 评论 -
LeetCode 696. 计数二进制子串 (思维、自己的拓展思考)
计数二进制子串 思路 求出连续的0或1的个数,构成一个数组。 比如: 00111100011 那就应该是 2 4 3 2 借鉴回文串的中心拓展的思想,相邻的一对数字可以新增加min(cnt[i],cnt[i+1])min(cnt[i],cnt[i+1])min(cnt[i],cnt[i+1]),累计求和即可。 class Solution { public: int countBinarySubstrings(string s) { vector<int> cnt;原创 2020-08-10 01:32:37 · 69 阅读 · 0 评论 -
LeetCode 454. 四数相加|| (分组、哈希表)
四数相加|| 从两个表、三个表拓展而来,比较容易好想。 class Solution { public: int fourSumCount(vector<int>& a, vector<int>& b, vector<int>& c, vector<int>& d) { int ans = 0; unordered_map<int,int> mp; for(in原创 2020-08-05 11:52:48 · 88 阅读 · 0 评论 -
LeetCode 632. 最小区间 (哈希表+滑动窗口)
最小区间 如果用滑动窗口,要先会做这道题,最小覆盖子串 这种求满足条件的最长区间或者最短区间问题,很多时候都可以用滑动窗口解决。 class Solution { public: map<int,vector<int>> mp; vector<int> smallestRange(vector<vector<int>>& nums) { vector<int> ans = {-100000,100原创 2020-08-01 11:05:31 · 115 阅读 · 0 评论 -
LeetCode 49. 字母异位词分组(排序+散列表)
字母异位词分组 时间复杂度: O(N∗len∗log(len))O(N*len*log(len))O(N∗len∗log(len)) class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> ans; unordered_map<str.原创 2020-07-06 20:34:24 · 60 阅读 · 0 评论 -
LeetCode 347. 前 K 个高频元素 (map和priority_queue的使用)
class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int> count; priority_queue<pair<int,int>> pq; vector<int> ans; for(int x:nums){原创 2020-07-04 21:18:59 · 101 阅读 · 0 评论 -
LeetCode 594. 最长和谐子序列(哈希表的运用)
最长和谐子序列 用一个map<int,vector<int>>记录一下数组中元素出现的下标,或者用map<int,int>记录元素出现的次数,是一种很常见的数组处理的方式。 class Solution { public: int findLHS(vector<int>& nums) { map<int,int> mp; int ans = 0; for(int i=0;i<nu原创 2020-07-04 15:52:17 · 103 阅读 · 0 评论 -
LeetCode 面试题 17.26. 稀疏相似度 (关键就是“稀疏”)
稀疏相似度 最为朴素的做法: 文档之间一一匹配,然后用一个set<int>,记录一下两个文的并集,然后用原来的个数之和减去并集的个数即为交集数。 时间复杂度: O(n2∗len)O(n^2*len)O(n2∗len) class Solution { public: vector<string> ans; vector<string> computeSimilarities(vector<vector<int>>& docs原创 2020-07-02 22:00:49 · 154 阅读 · 0 评论 -
LeetCode 15. 三数之和 ( 双指针 || 哈希表 )
基本想法是,暴力法的优化。 纯暴力法,三层循环,O(n3)O(n^3)O(n3)。 如何优化。 用unordered_map<int,int> m;记录某个元素是否出现,以及出现了几次。 然后对unordered_map<int,int> m;里面的键进行两层循环的枚举, 然后看要求的那个数是否出现在map里,如果出现,那么求出三个元素的出现的次数(因为不允许重复使用)。 最后,这种写法还要注意去重。 总之,这种写法差点AC不了。但是还是记录一下。 class Solution {原创 2020-06-12 18:12:55 · 194 阅读 · 1 评论 -
LeetCode 202. 快乐数 (set记录、出现循环节中的数则失败)
快乐数 class Solution { public: unordered_set<int> vis; bool isHappy(int n) { vis.insert(n); if(n==1){ return 1; } while(1){ long long sum = f(n); if(sum==1){ r原创 2020-06-26 06:44:31 · 90 阅读 · 0 评论 -
LeetCode 961. 重复 N 次的元素 (大水题)
重复 N 次的元素 class Solution { public: unordered_set<int> s; int repeatedNTimes(vector<int>& A) { for(int x:A){ if(s.count(x)){ return x; } s.insert(x); } retu.原创 2020-06-26 06:31:47 · 104 阅读 · 0 评论 -
LeetCode 1207. 独一无二的出现次数 (STL库 || 自己hash函数、数组映射)
独一无二的出现次数 版本1: 优点:耗空间少、可拓展性强 缺点:时间开销大一点 class Solution { public: unordered_map<int,int> m; unordered_set<int> vis; bool uniqueOccurrences(vector<int>& arr) { for(int x:arr){ m[x]++; } f原创 2020-06-23 21:02:08 · 89 阅读 · 0 评论 -
LeetCode 面试题 16.24. 数对和 (双指针、哈希表)
数对和 双指针: class Solution { public: vector<vector<int>> pairSums(vector<int>& nums, int target) { vector<vector<int>> ans; sort(nums.begin(),nums.end()); int l=0,r=nums.size()-1; whil.原创 2020-06-23 20:21:08 · 189 阅读 · 0 评论