力扣75——哈希表/哈希集合

总结leetcode75中哈希表/哈希集合 的算法题解题思路。

上一篇:力扣75------滑动窗口

以下代码大部分为本人所写,少部分为官方示例代码。

力扣75------哈希表/哈希集合

  • [1 找出两数组的不同](#1 找出两数组的不同)
  • [2 独一无二的出现次数](#2 独一无二的出现次数)
  • [3 确定两个字符串是否接近](#3 确定两个字符串是否接近)
  • [4 相等行列对](#4 相等行列对)
  • [1-4 解题总结](#1-4 解题总结)

1 找出两数组的不同

题目

cpp 复制代码
给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:

answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。
answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。
注意:列表中的整数可以按 任意 顺序返回。

题解:先用哈希表分别记录各自的元素,然后各自检测是否有不存在于对方的元素。

cpp 复制代码
class Solution {
public:
    vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> set1, set2;   // nums1 与 nums2 所有元素的哈希集合
        for (int num: nums1) {
            set1.insert(num);
        }
        for (int num: nums2) {
            set2.insert(num);
        }
        vector<vector<int>> res(2);
        for (int num: set1) {
            if (!set2.count(num)) {
                res[0].push_back(num);
            }
        }
        for (int num: set2) {
            if (!set1.count(num)) {
                res[1].push_back(num);
            }
        }
        return res;
    }
};

2 独一无二的出现次数

题目

cpp 复制代码
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

题解:先用unordered_map记录每个字母出现的次数,然后把次数存日哈希表,如果哈希表的长度与map的长度一致,则证明次数都是独一无二的。

cpp 复制代码
 class Solution {
 public:
	 bool uniqueOccurrences(vector<int>& arr) {
		 unordered_map<int,int> umap;
		 for (auto a : arr) {
			 if (umap.count(a)) {
				 umap[a] += 1;
			 }
			 else {
				 umap[a] = 1;
			 }
		 }
		 unordered_set<int> uset;
		 for (auto iter = umap.begin(); iter != umap.end(); iter++) {
			 uset.insert(iter->second);
		}
		 return umap.size() == uset.size();
	 }
 };

3 确定两个字符串是否接近

题目

cpp 复制代码
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :

操作 1:交换任意两个 现有 字符。
例如,abcde -> aecdb
操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )
你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。

题解:根据题目意思,字符串接近有2个条件:第一个:2个字符串的字符种类一致;第二个:2个字符串中各类字符出现次数的集合相等。

cpp 复制代码
class Solution {
public:
    bool closeStrings(string word1, string word2) {
        // 验证word1和word2长度相同
        if(word1.length() != word2.length()) return false;
        // 验证word1和word2包含的字母相同
        vector<int> v1(26, 0), v2(26, 0);
        for(char c : word1) v1[c - 'a']++;
        for(char c : word2) v2[c - 'a']++;
        for(int i = 0; i < 26; ++i){
            if((v1[i] == 0 && v2[i] != 0)
                ||(v1[i] != 0 && v2[i] == 0)) return false;
        }
        // 验证word1和word2"结构"相同
        sort(v1. begin(), v1.end());
        sort(v2. begin(), v2.end());
        if(v1 != v2) return false;
        return true;
    }
};

4 相等行列对

题目

cpp 复制代码
给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。

如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

题解:将行存入哈希表,然后遍历每一列。

cpp 复制代码
class Solution {
public:
    int equalPairs(vector<vector<int>>& grid) {
        int n = grid.size();
        map<vector<int>, int> cnt;
        for (auto row : grid) {
            cnt[row]++;
        }

        int res = 0;
        for (int j = 0; j < n; j++) {
            vector<int> arr;
            for (int i = 0; i < n; i++) {
                arr.emplace_back(grid[i][j]);
            }
            if (cnt.find(arr) != cnt.end()) {
                res += cnt[arr];
            }
        }
        return res;
    }
};

1-4 解题总结

这几道题都比较简单。

特点:当需要对一串数据做统计时,可以考虑用哈希表。

相关推荐
郝学胜-神的一滴2 小时前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
佳xuan2 小时前
简而言之c++
c++·算法
屯子来了2 小时前
Windows + VS2022 + UE5.2 编译 Fast DDS 2.14.0 完整记录
c++·ue5·fastdds
顶点多余2 小时前
自定义协议、序列化、反序列化实现
java·linux·开发语言·c++·tcp/ip
Bruce_kaizy2 小时前
c++ linux环境编程——从应用层到linux内核深入了解文件io的调用机制(爆肝)
linux·c++·c·嵌入式linux·文件io
z200509303 小时前
C++中的右值引用
开发语言·c++
代码中介商3 小时前
C++文件流操作全解析
开发语言·c++
会周易的程序员3 小时前
aiDgeScanner架构与实现
c++·ide·物联网·架构·node.js·aiot
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:生日
c++·字符串·csp·高频考点·信奥赛·生日·字符串排序
Kiyra3 小时前
Agent 的记忆不是存数据库就行:上下文预算与轻量记忆的设计实战
数据库·人工智能·后端·面试·职场和发展·哈希算法