大楼轮廓,值等于aim的最大子数组,异或数组(值未解决)
程序1:大楼轮廓
#include<iostream> //大楼轮廓 ,比较器,vector排序,map找最后一个元素时出错,未解决
using namespace std;
#include<string>
#include<typeinfo>
#include<deque>
#include<algorithm>
#include<stack>
#include<map>
struct Node
{
bool isUp;
int position;
int height;
Node(){};
Node(bool bORe,int posi,int h)
{
isUp = bORe;
position = posi;
height = h;
}
};
class compater
{
public:
bool operator()(Node n1,Node n2)
{
if(n1.position!=n2.position)
{
return n1.position<n2.position;
}
if(n1.isUp!=n2.isUp)
{
return n1.isUp?-1:1;
}
}
};
vector<vector<int> > buildingOutline(vector<vector<int> > buildings)
{
vector<Node> nodes;
for(int i = 0;i<buildings.size();i++)
{
Node a;
a = Node(true, buildings[i][0], buildings[i][2]);
nodes.push_back(a);
a = Node(false, buildings[i][1], buildings[i][2]);
nodes.push_back(a);
}
sort(nodes.begin(),nodes.end(),compater());
cout<<"position"<<" :";
for(int i =0;i<nodes.size();i++)
{
cout<<nodes[i].position<<" "<<nodes[i].height<<" "<<nodes[i].isUp<<endl;
}
cout<<"end"<<endl;
map<int,int> htMap; //key是某一个高度,value是这个高度出现的次数
map<int,int> pmMap;
for(int i = 0;i<nodes.size();i++)
{
if(nodes[i].isUp)
{
map<int,int>::iterator pos = htMap.find(nodes[i].height);
if(pos==htMap.end())
{
htMap.insert(pair<int,int>(nodes[i].height,1));
}
else
{
htMap.insert(pair<int,int>(nodes[i].height,pos->second+1));
}
}
else
{
map<int,int>::iterator pos = htMap.find(nodes[i].height);
if(pos!=htMap.end())
{
if(pos->second==1)
{
htMap.erase(pos);
}
else
{
htMap.insert(pair<int,int>(nodes[i].height,pos->second-1));
}
}
}
if(pmMap.empty())
{
pmMap.insert(pair<int,int>(nodes[i].position,0));
}
else
{
map<int,int>::reverse_iterator it = htMap.rbegin();
pmMap.insert(pair<int,int>(nodes[i].position,it->first)); //出错,未完成
}
}
vector<vector<int> > res; //生成轮廓
int start=0;
int height=0;
for(map<int,int>::iterator i=pmMap.begin();i != pmMap.end();i++) //pmMap的key是位置,如果遍历会按照key升序排列
{
int curPosition = i->first;
int curMaxHeight = i->second;
if(height!=curMaxHeight)
{
if(height!=0)
{
vector<int> newRecord;
newRecord.push_back(start);
newRecord.push_back(curPosition);
newRecord.push_back(height);
res.push_back(newRecord);
}
start = curPosition;
height = curMaxHeight;
}
}
return res;
}
int main()
{
vector<vector<int> >tmp;
vector<int> a;
a.push_back(1);
a.push_back(6);
a.push_back(4);
tmp.push_back(a);
vector<int> b;
b.push_back(2);
b.push_back(4);
b.push_back(3);
tmp.push_back(b);
vector<int> c;
c.push_back(5);
c.push_back(8);
c.push_back(5);
tmp.push_back(c);
vector<int> d;
d.push_back(7);
d.push_back(10);
d.push_back(3);
tmp.push_back(d);
vector<vector<int> >res = buildingOutline(tmp);
// for(int i=0;i<res.size();i++)
// {
// cout<<res[i][0]<<" "<<res[i][1]<<" "<<res[i][2]<<endl;
// }
return 0;
}
程序2:值等于aim的最大子数组,异或数组(未输出正确值)
#include<iostream> //值等于aim的最大子数组,异或数组
using namespace std;
#include<string>
#include<deque>
#include<algorithm>
#include<stack>
#include<map>
#include<vector>
#include<unordered_map>
int maxLength(vector<int> arr,int aim)
{
if(arr.size()==0)
{
return 0;
}
unordered_map<int,int> m;
m.insert(pair<int,int>(-1,0));
int len = 0;
int sum = 0;
for(int i=0;i<arr.size();i++)
{
sum+=arr[i];
if(m.find(sum-aim)!=m.end())
{
len = max(len,i-m.find(sum-aim)->second);
}
if(m.find(sum)==m.end())
{
m.insert(pair<int,int>(sum,i));
}
}
return len;
}
int mostEOR(vector<int>arr)
{
int ans = 0;
int x_or = 0;
int len = arr.size();
int dp[len] = {0};
unordered_map<int,int>m2;
m2.insert(pair<int,int>(0,-1));
for(int i =0;i<arr.size();i++)
{
x_or^=arr[i];
if(m2.find(x_or)!=m2.end())
{
int pre = m2.find(x_or)->second;
dp[i] = pre ==-1?1:(dp[pre]+1);
}
if(i>0)
{
dp[i]=max(dp[i-1],dp[i]);
}
m2.insert(pair<int,int>(x_or,i));
ans = max(ans,dp[i]);
}
return ans;
}
int main()
{
vector<int>a;
a.push_back(7);
a.push_back(3);
a.push_back(2);
a.push_back(1);
a.push_back(1);
a.push_back(7);
a.push_back(-6);
a.push_back(-1);
a.push_back(7);
// cout<<maxLength(a,7);
vector<int>b;
b.push_back(3);
b.push_back(2);
b.push_back(1);
b.push_back(0);
b.push_back(1);
b.push_back(2);
b.push_back(3);
b.push_back(0);
cout<<mostEOR(b);
return 0;
}
深信服公司福利 757人发布