代码随想录笔记--哈希表篇

目录

1--有效的字母异位词

2--两个数组的交集

3--两数之和

4--四数相加II

5--三数之和

6--四数之和


1--有效的字母异位词

        利用哈希表存储每个字母的出现次数,比较两个字符串各个字母出现次数是否相等即可;

#include <iostream>
#include <string>
#include <vector>class Solution {
public:bool isAnagram(std::string s, std::string t) {// 用数组实现哈希表std::vector<int> hash(26, 0);for(auto i = 0; i < s.length(); i++){hash[s[i] - 'a']++; }// 遍历字符串tfor(auto i = 0; i < t.length(); i++){hash[t[i] - 'a']--; }// 遍历哈希表for(int i = 0; i < 26; i++){if(hash[i] != 0) return false;}return true;}
};int main(int argc, char argv[]){// s = "anagram", t = "nagaram"std::string s = "anagram", t = "nagaram";Solution S1;bool res = S1.isAnagram(s, t);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}

2--两个数组的交集

        利用哈希表存储数组1的元素,接着遍历数组2并判断元素是否存储在哈希表中,将交集元素存储并返回;

#include <iostream>
#include <unordered_set>
#include <vector>class Solution {
public:std::vector<int> intersection(std::vector<int>& nums1, std::vector<int>& nums2) {std::unordered_set<int> hash1;for(int i = 0; i < nums1.size(); i++){hash1.insert(nums1[i]);}std::unordered_set<int> result;for(int i = 0; i < nums2.size(); i++){if(hash1.find(nums2[i]) != hash1.end()){result.insert(nums2[i]);}}std::vector<int> res;for(auto item : result){res.push_back(item);}return res;}
};int main(int argc, char argv[]){// nums1 = [1,2,2,1], nums2 = [2,2]std::vector<int> nums1 = {1, 2, 2, 1}, nums2 = {2, 2};Solution S1;std::vector<int> res = S1.intersection(nums1, nums2);for(auto item : res) std::cout << item << " ";std::cout << std::endl;return 0;
}

3--两数之和

        利用哈希表存储,key 为 target - nums[i],value 为 i;遍历数组判断当前nums[i]是否在哈希表中出现,返回匹配的两个结果对应的索引即可;

#include <iostream>
#include <unordered_map>
#include <vector>class Solution {
public:std::vector<int> twoSum(std::vector<int>& nums, int target) {std::vector<int> res;std::unordered_map<int, int> hash;for(int i = 0; i < nums.size(); i++){if(hash.find(nums[i]) != hash.end()){res.push_back(hash[nums[i]]);res.push_back(i);return res;}hash.emplace(target - nums[i], i);}return res;}
};int main(int argc, char argv[]){// nums = [2,7,11,15], target = 9std::vector<int> nums = {2, 7, 11, 15};int target = 9;Solution S1;std::vector<int> res = S1.twoSum(nums, target);for(auto item : res) std::cout << item << " ";std::cout << std::endl;return 0;
}

4--四数相加II

        利用哈希表,其中key为两个数组对应元素的和,value为出现的次数;接着遍历剩下两个数组的元素和是否在哈希表中出现,记录出现的次数即匹配结果;

#include <iostream>
#include <unordered_map>
#include <vector>class Solution {
public:int fourSumCount(std::vector<int>& nums1, std::vector<int>& nums2, std::vector<int>& nums3, std::vector<int>& nums4) {std::unordered_map<int, int> hash;for(int i = 0; i < nums1.size(); i++){for(int j = 0; j < nums2.size(); j++){hash[(nums1[i] + nums2[j])] ++;}}int res = 0;for(int i = 0; i < nums3.size(); i++){for(int j = 0; j < nums3.size(); j++){if(hash.find(0 - (nums3[i] + nums4[j])) != hash.end()){res += hash[0 - (nums3[i] + nums4[j])];}}}return res;}
};int main(int argc, char argv[]){// nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]std::vector<int> nums1 = {1, 2}, nums2 = {-2, -1}, nums3 = {-1, 2}, nums4 = {0, 2};Solution S1;int res = S1.fourSumCount(nums1, nums2, nums3, nums4);std::cout << res << std::endl;return 0;
}

5--三数之和

        本题基于双指针算法,需要注意去重;

#include <iostream>
#include <vector>
#include <algorithm>class Solution {
public:std::vector<std::vector<int>> threeSum(std::vector<int>& nums) {std::vector<std::vector<int>> res;std::sort(nums.begin(), nums.end());for(int i = 0; i < nums.size(); i++){if(i > 0 && nums[i] == nums[i - 1]) continue; // 去重int l = i + 1, r = nums.size() - 1;while(l < r){if(l > i + 1 && nums[l] == nums[l - 1]){l++;continue; // 去重}if(nums[i] + nums[l] + nums[r] == 0){res.push_back({nums[i], nums[l], nums[r]});l++;r--;}else if(nums[i] + nums[l] + nums[r] > 0){r--;}else{l++;}}}return res;}
};int main(int argc, char* argv[]){// nums = [-1,0,1,2,-1,-4]std::vector<int> nums = {-1, 0, 1, 2, -1, -4};Solution S1;std::vector<std::vector<int>> res = S1.threeSum(nums);for(auto item : res){for(auto v : item) std::cout << v << " ";std::cout << std::endl;}return 0;
}

6--四数之和

类似于三数之和,只需额外多遍历一次,同时注意剪枝和去重的操作;

#include <iostream>
#include <vector>
#include <algorithm>class Solution {
public:std::vector<std::vector<int>> fourSum(std::vector<int>& nums, int target) {std::vector<std::vector<int>> res;std::sort(nums.begin(), nums.end());int len = nums.size();for(int i = 0; i < len; i++){// 剪枝if(nums[i] >= 0 && nums[i] > target) break;// 去重if(i > 0 && nums[i] == nums[i-1]) continue;// three sumfor(int j = i + 1; j < len; j++){// 剪枝if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) break;// 去重if (j > i + 1 && nums[j] == nums[j - 1]) continue;int l = j + 1, r = len - 1;while(l < r){if((long) nums[i] + nums[j] + nums[l] + nums[r] == target){res.push_back({nums[i], nums[j], nums[l], nums[r]});// 去重while (r > l && nums[r] == nums[r - 1]) r--;while (r > l && nums[l] == nums[l + 1]) l++;l++;r--;}else if((long) nums[i] + nums[j] + nums[l] + nums[r] < target){l++;}else{r--;}}}}return res;}
};int main(int argc, char* argv[]){// nums = [-1,0,1,2,-1,-4]std::vector<int> nums = {1, 0, -1, 0, -2, 2};int target = 0;Solution S1;std::vector<std::vector<int>> res = S1.fourSum(nums, target);for(auto item : res){for(auto v : item) std::cout << v << " ";std::cout << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/94024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…

JavaScript页面怎么跳转

在JavaScript中&#xff0c;可以使用window.location对象来实现页面跳转。window.location对象包含了当前页面的URL信息&#xff0c;可以通过修改它的属性来实现页面跳转。 以下是一些常见的页面跳转方式&#xff1a; 使用window.location.href属性来跳转到一个新的URL&#…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号&#xff0c;显示成绩】 7、统计。【…

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现EEMD-SSA-LSTM、E…

安全帽人脸联动闸机开关算法

安全帽人脸联动闸机开关算法通过yolov7python网络模型深度学校框架 &#xff0c;安全帽人脸联动闸机开关算法能够判断人员是否穿戴规定的工装是不是现场人员&#xff0c;当穿戴合规且为现场人员&#xff0c;闸机门禁才打开。YOLO的结构非常简单&#xff0c;就是单纯的卷积、池化…

Linux--VMware的安装和Centos

一、VMware和Linux的关系 二、VMware的安装 VM_ware桌面虚拟机 最新中文版 软件下载 (weizhen66.cn) VMware-Workstation-Lite-16.2.2-19200509-精简安装注册版.7z - 蓝奏云 如果安装不成功&#xff0c;则设置BIOS 三、在VMware中加入Centos 下载地址&#xff1a; CentOS-…

使用DOSBOX运行TurboC2,TC2使用graphics库绘图

Turbo C是由美国Borland公司开发的一套C语言程序开发工具&#xff0c;Borland公司是一家专门从事软件开发、研制的大公司。该公司相继推出了一套Turbo系列软件&#xff0c;如Turbo BASIC、Turbo Pascal、Turbo Prolog&#xff0c;这些软件很受用户欢迎 [1] 。 Turbo C集成了程序…

Mac 多版本jdk安装与切换

macOS上可以安装多个版本的jdk&#xff0c;方法如下&#xff1a; 1.下载jdk 在Oracle官网上下载不同版本的jdk&#xff1a; https://www.oracle.com/java/technologies/downloads/#java17 方案一 1.查看本机所有的jdk /usr/libexec/java_home -V3. 配置环境变量 打开bash_…

OceanBase安全审计之传输加密

上一期我们讲了关于 OceanBase 安全审计的《身份鉴别》和《用户管理与访问控制》 两个部分&#xff0c;OceanBase 的安全机制介绍其支持传输加密&#xff0c;今天我们主要来实践一下如何配置传输加密以及验证是否真的加密。 作者&#xff1a;金长龙 爱可生测试工程师&#xff0…

【计算机基础】Git从安装到使用,详细每一步!扩展Github\Gitlab

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

maven本地安装jar包install-file,解决没有pom的问题

背景&#xff1a; 公司因为权限问题&#xff0c;没有所有的代码&#xff0c;内部maven还在搭建&#xff0c;所以需要拿到同事的jar包&#xff0c;本地install&#xff1a; mvn install:install-file -DgroupIdcom..framework -DartifactIdcloud-api -Dversion1.0.0-SNAPSHOT …

最详细Maven下载、安装、配置教程

Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目&#xff0c;其主要服务于基于Java平台的项目创建&#xff0c;依赖管理和项目信息管理。maven是Apache的顶级项目&#xff0c;解释为“专家&#xff0c;内行”&#xff0c;它是一个项目管理的工具&…