unordered_map基础运用
首先要求编译器支持C++11;
引入头文件:
#include<unordered_map>
创建
unordered_map<int,int> mymap;//键为int,值为int
增
mymap.insert({key,val});
删
mymap.erase(key);//key指所要删除的键值对的键
改
mymap[key]=val;
查
auto n=mymap.find(key);//key为所要找的键
cout<<n->first<<n->second;//first指键,second指值
size
int l=mymap.size();返回键值对个数
遍历
for(auto &pair : mymap){
cout<<pair.first<<pair.second;
}
前缀和思想
例题
一行中有n个整数,这些整数只能是1或0,请找出这串整数的最大子串,使得该子串中1和0的个数相等。输出该子串的长度,如果未找到,则输出0。
思路
将该n个整数存在数组a[n]中。
将数组中为0的值重置为-1;为1的值不变。
用数组sum[ n ]记录前缀和,sum[ i ]等于数组a中前i-1个数之和。sum[0]=0;
如果sum[ i ]==sum[ j ],则说明数组a的第i位至第j位构成的子串中-1和1的数量相等。
此时要找出所有j-i的最大值,即为所求输出。
如何找到最大的j-i: 构建unordered_map<int,int> mymap;初始化
m
a
x
=
0
max=0
max=0.
在每次求取sum[i]的同时判断mymap中是否有以sum[ i ]为键的键值对,如果没有则以sum[i] 为键,i 为值,存入mymap中;如果有则不对mymap进行增加操作,而记录下 i-mymap[ sum[ i ] ] 的值为
l
l
l(即当前遍历到的位置减去最初记录的与此时前缀和相等的元素的位置).如果
l
>
m
a
x
l>max
l>max则将
l
l
l赋值给
m
a
x
max
max,遍历完sum数组后,输出
m
a
x
max
max.
代码
#include<iostream>
#include<unordered_map>
using namespace std;
int main(){
int n;
cin>>n;
unordered_map<int ,int > map;
int max=0;
int a[n];
for(int i=0;i<n;i++){
int temp;
cin>>temp;
if(temp==0)a[i]=-1;
else a[i]=1;
}
int sum[n+1];
sum[0]=0;
map[sum[0]]=0;
for(int i=1;i<n+1;i++){
int l=0;
sum[i]=sum[i-1]+a[i-1];
if(map.find(sum[i])==map.end()){
map[sum[i]]=i;
}
else {
l=i-map[sum[i]];
}
if(max<l)max=l;
}
cout<<max;
return 0;
}
如有错误与不完整之处,请多多指教!