力扣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 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:雷达安装
c++·算法·贪心·csp·信奥赛·区间贪心·雷达安装
elseif1233 分钟前
分组背包1
c++·学习·算法
im_AMBER7 分钟前
Leetcode 160 最小覆盖子串 | 串联所有单词的子串
开发语言·javascript·数据结构·算法·leetcode
Rabitebla9 分钟前
【数据结构】动态顺序表实现详解:从原理到接口设计(面试视角)
c语言·开发语言·数据结构·c++·面试·职场和发展
小明同学0112 分钟前
[C++入门]万字长文梳理 C++11 核心特性
c++
郝学胜-神的一滴18 分钟前
Linux 高并发基石:epoll 核心原理 + LT/ET 触发模式深度剖析
linux·运维·服务器·开发语言·c++·网络协议
Hello!!!!!!24 分钟前
C++基础(六)——数组与字符串
c++·算法
天若有情6731 小时前
反向封神!C++ 全局单例不避反用,实现无锁多线程函数独占访问
java·javascript·c++
智者知已应修善业1 小时前
【51单片机调用__TIME__无法实时时间】2023-7-10
c++·经验分享·笔记·算法·51单片机
凤凰院凶涛QAQ1 小时前
《C++转JAVA快速入手系列》:基本通用语法篇
java·开发语言·c++