当前位置: 首页 > ops >正文

a+b+c+d==0(用哈希表进行优化)

std::unordered_map 基本用法

​(1) 声明与初始化

#include <unordered_map>
#include <string>std::unordered_map<std::string, int> wordCount;  // 键: string, 值: int// 初始化方式
std::unordered_map<int, std::string> idToName = {{1, "Alice"},{2, "Bob"},{3, "Charlie"}
};

​(2) 插入元素

// 方式1: insert()
wordCount.insert({"apple", 3});  // 如果 "apple" 已存在,不会覆盖// 方式2: emplace() (更高效)
wordCount.emplace("banana", 5);  // 直接构造,避免临时对象// 方式3: operator[]
wordCount["orange"] = 2;  // 如果 "orange" 不存在,会自动插入

​(3) 访问元素

// 方式1: operator[] (如果 key 不存在,会插入默认值)
int count = wordCount["apple"];  // 如果不存在,返回 0(int 的默认值)// 方式2: at() (如果 key 不存在,抛出 std::out_of_range 异常)
int count = wordCount.at("apple");// 方式3: find() (返回迭代器,如果不存在则返回 end())
auto it = wordCount.find("apple");
if (it != wordCount.end()) {std::cout << "Count: " << it->second << std::endl;
}

​(4) 删除元素

// 方式1: erase(key)
wordCount.erase("apple");// 方式2: erase(iterator)
auto it = wordCount.find("banana");
if (it != wordCount.end()) {wordCount.erase(it);
}// 方式3: clear() (清空整个哈希表)
wordCount.clear();

​(5) 遍历哈希表

// 方式1: 范围 for 循环
for (const auto& pair : wordCount) {std::cout << pair.first << ": " << pair.second << std::endl;
}// 方式2: 迭代器
for (auto it = wordCount.begin(); it != wordCount.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;
}

std::unordered_set 基本用法

unordered_set 类似于 unordered_map,但只存储键(无值)。

​(1) 声明与初始化

#include <unordered_set>std::unordered_set<int> uniqueNumbers = {1, 2, 3, 4, 5};

​(2) 插入元素

uniqueNumbers.insert(6);
uniqueNumbers.emplace(7);  // 更高效

​(3) 查找元素

if (uniqueNumbers.find(3) != uniqueNumbers.end()) {std::cout << "3 exists!" << std::endl;
}

​(4) 删除元素

uniqueNumbers.erase(3);  // 删除值为 3 的元素

​(5) 遍历集合

for (int num : uniqueNumbers) {std::cout << num << std::endl;
}

其实我最初没有用哈希表,但时间上不给我过

先把题目亮出来:

我最初的代码是:

# include<iostream>
# include<vector>
# include<algorithm>
using namespace std;int main()
{int T;cin>>T;while(T--){int n;cin>>n;vector<int> a(n);vector<int> b(n);vector<int> c(n);vector<int> d(n);for(int i=0;i<n;i++){cin>>a[i]>>b[i]>>c[i]>>d[i];}	vector<int> result1(n*n);vector<int> result2(n*n);int k = 0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){result1[k] = a[i]+b[j];result2[k] = c[i]+d[j];k++;}}sort(result1.begin(),result1.end());sort(result2.begin(),result2.end());int count = 0;int location1 = 0;int location2 = 0;for(int i=0;i<n*n;i++){if(result1[i]<0){location1++;}else{break;}}for(int i=0;i<n*n;i++){if(result2[i]<0){location2++;}else{break;}}int start = 0;int end = n*n;for(int i=0;i<n*n;i++){if(result1[i]<0){start = location2;end = n*n;}else{start = 0;end = location2;}for(int j=start;j<=end;j++){if(result1[i]+result2[j]==0){count++;if((j+1)<n*n&&result2[j+1]!=result2[j]){break;}}if(result1[i]+result2[j]>0){break;}}}cout<<count<<endl;}return 0;
}

代码本身没有问题,时间上不够优化

接下来就是用哈希表进行操作,但是思想其实不复杂:

# include<iostream>
# include<vector>
# include<algorithm>
# include<unordered_map>
using namespace std;int main()
{int T;cin>>T;while(T--){int n;cin>>n;vector<int> a(n);vector<int> b(n);vector<int> c(n);vector<int> d(n);for(int i=0;i<n;i++){cin>>a[i]>>b[i]>>c[i]>>d[i];}unordered_map<int,int> arr(n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){arr[a[i]+b[j]]++;}}int count = 0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){int target = -(c[i]+d[j]);if(arr.find(target)!=arr.end()){count+=arr[target];}}}cout<<count<<endl;}	return 0;
}

当你在看上面代码的时候,其实并不是特别难,你肯定是可以看懂的,所以其实没有太大的必要去做额外的解释。

ok,这题就到这里。

 

http://www.xdnf.cn/news/8791.html

相关文章:

  • 进行性核上性麻痹患者饮食指南:防呛咳、补营养的科学吃法
  • Java NPE为什么不会导致进程崩溃(CoreDump)
  • 同为科技 智能PDU产品选型介绍 EN10/G801FLR
  • 多角色多端状态控制与锁控制
  • Java Web
  • 一周学会Pandas2之Python数据处理与分析-Pandas2数据合并与对比-df.combine_first():填充合并
  • 李白、杜甫和白居易三者之间是否存在交集?
  • 6.4.2_1最短路径问题_BFS算法
  • 简单了解下Nacos
  • 【C语言指南】二维数组:概念、初始化与遍历
  • 5GC网络中的QoS Flow级QoS控制
  • Arduino Uno 热敏传感器实验
  • 防火墙高可用(HA)主备验证实验(eNSP)
  • 构造题(Constructive Problem)
  • ROS云课三分钟-阿克曼车式移动机器人倒车入库出库测试实验
  • python | vscode | 使用uv快速创建虚拟环境(实现一个项目一个虚拟环境,方便环境管理)
  • ADS学习笔记(三) 瞬态仿真
  • 【每天一个知识点】计算思维
  • java基础(面向对象高级部分)
  • [学习]浅谈C++异常处理(代码示例)
  • 2025.5.22 Axure 基础与线框图制作学习笔记
  • Linux中的文件系统和软硬连接
  • OpenGL环境配置
  • GAMES104 Piccolo引擎搭建配置
  • 【IPMV】图像处理与机器视觉:Lec12 Blob Detector 斑点检测
  • 进程通信-内存共享
  • 使用Java制作贪吃蛇小游戏
  • 历年福州大学保研上机真题
  • Java字符编码转换:从UTF-8到GBK的实现原理与实践
  • 【多线程】Java 实现方式及其优缺点