题目描述
现有一些随机生成的数字要将其依次传入,请设计一个高效算法,对于每次传入一个数字后,算出当前所有传入数字的中位数。(若传入了偶数个数字则令中位数为第n/2小的数字,n为已传入数字个数)。
给定一个int数组A,为传入的数字序列,同时给定序列大小n,请返回一个int数组,代表每次传入后的中位数。保证n小于等于1000。
测试样例:
[1,2,3,4,5,6],6
返回:[1,1,2,2,3,3]
class Middle {
public:
vector<int> getMiddle(vector<int> A, int n) {
// write code here
vector<int> maxheap;
vector<int> minheap;
vector<int> re;
for(int i=0;i<n;++i)
{
if(maxheap.size()==minheap.size())
{
if(minheap.size()>0&&minheap.front()<A[i])
{
pop_heap(minheap.begin(),minheap.end(),greater<int>());
maxheap.push_back(minheap.back());
push_heap(maxheap.begin(),maxheap.end(),less<int>());
minheap.pop_back();
minheap.push_back(A[i]);
push_heap(minheap.begin(),minheap.end(),greater<int>());
}
else
{
maxheap.push_back(A[i]);
push_heap(maxheap.begin(),maxheap.end(),less<int>());
}
}
else
{
if(maxheap.front()>A[i])
{
pop_heap(maxheap.begin(),maxheap.end(),less<int>());
minheap.push_back(maxheap.back());
push_heap(minheap.begin(),minheap.end(),greater<int>());
maxheap.pop_back();
maxheap.push_back(A[i]);
push_heap(maxheap.begin(),maxheap.end(),less<int>());
}
else
{
minheap.push_back(A[i]);
push_heap(minheap.begin(),minheap.end(),greater<int>());
}
}
//if(maxheap.size()==minheap.size())
// re.push_back(minheap.front());
//else
re.push_back(maxheap.front());
}
return re;
}
};
/*
class Middle
{
public:
vector<int> getMiddle(vector<int> A, int n)
{
// write code here
//插入排序
vector<int> result;
result.push_back(A[0]);
for(int i=1;i<n;i++)
{
int k=i;
while(k>0)
{
if(A[k]<A[k-1])
swap(A[k],A[k-1]);
else
break;
k--;
}
result.push_back(A[i/2]);
}
return result;
}
};
*/
题目描述
现有一个字典,同时给定字典中的两个字符串s和t,给定一个变换,每次可以改变字符串中的任意一个字符,请设计一个算法,计算由s变换到t所需的最少步数,同时需要满足在变换过程中的每个串都是字典中的串。
给定一个string数组dic,同时给定数组大小n,串s和串t,请返回由s到t变换所需的最少步数。若无法变换到t则返回-1。保证字符串长度均小于等于10,且字典中字符串数量小于等于500。
测试样例:
["abc","adc","bdc","aaa”],4,”abc","bdc"
返回:2
BFS
class Change {
public:
int countChanges(vector<string> dic, int n, string s, string t)
{
// write code here
map<string,int> mapp;
for(int i=0;i<n;i++)
{
mapp[dic[i]]=1;
}
//宽度优先搜索
queue<string> q;
q.push(s);
map<string,int> mapped;
mapped[s]=1;
//bool flag=false; //标示是否能变换成功
int cur=1; //当前层待弹出节点数目
int next=0;
int step=0;
while(!q.empty())
{
while(cur--)
{
string str=q.front();
for(int i=0;i<str.size();i++)
{
string ss=str;
for(char c='a';c<='z';c++)
{
ss[i]=c;
if(ss==t)
{
return ++step;
}
if(mapped[ss]==0&&mapp[ss]==1)
{
next++;
mapped[ss]=1;
q.push(ss);
}
}
}
q.pop();
}
cur=next;
next=0;
step++;
}
return -1;
}
};