我遇到了以下問題將數字分組在列表中
給出了一個包含n個元素的數組A.這些元素現在被添加到一個新的列表L中,該列表最初是空的,並且基於給定的q查詢以特定的順序。
- 在每個查詢您將得到對應於甲的整數i [i]於陣列A.這意味着必須要添加的元素A [1],將列表L
- 每個後元素添加到列表L中,在列表L中的元素之間進行分組。如果數組A中的索引是連續的,則兩個元素將在同一組中。
- 對於每個組,我們將組的值定義爲axb其中a是該組中的最大值,b是該組的大小。
打印每個元素被添加到列表中後L.
我的方法所形成的所有組中的最大組值是使用一個map<int,vector<int>>
,其中關鍵是組號和值是一個矢量包含組大小,最大值的組。我還有一個數組g和g [i],表示a [i]的組號,如果它不在任何組中,則爲-1。下面的代碼是我實現的一部分,但我相信有更好的方法來解決這個問題,因爲我的解決方案在某些情況下給了TLE和WA,而我似乎無法找出正確的方法。請提出解決此問題的最佳方法。
int g[a.size()+2]; //+2 because queries start with index 1, and g[i] corresponds to a[i-1]
for(int i=0;i<a.size()+2;i++)
g[i]=-1;
int gno=1;
map<int,vector<int> > m;
vector<int> ans;
int mx=0;
for(unsigned int i=0;i<queries.size();i++){
int q = queries[i];
if(g[q-1]==-1 && g[q+1]==-1){
//create new group with current eleent as first element
g[q] = gno; //gno is the group number.
vector<int> v;
v.push_back(1);
v.push_back(a[q-1]);
m[gno]=v;
mx = max(mx,m[gno][0]*m[gno][1]);
gno++;
}
else if(g[q-1]!=-1 && g[q+1]==-1){
//join current element to left group
g[q] = g[q-1];
m[g[q]][0]++;
m[g[q]][1] = max(m[g[q]][1],a[q-1]);
mx = max(mx,m[g[q]][0]*m[g[q]][1]);
}
else if(g[q-1]==-1 && g[q+1]!=-1){
//join current element to right group
g[q] = g[q+1];
m[g[q]][0]++;
m[g[q]][1] = max(m[g[q]][1],a[q-1]);
mx = max(mx,m[g[q]][0]*m[g[q]][1]);
}
else{
//join both groups to left and right
g[q]=g[q-1];
int g1 = g[q];
int i;
m[g[q]][0] += 1 + m[g[q+1]][0];
m[g[q]][1] = max(m[g[q]][1],max(a[q-1],m[g[q+1]][1]));
for(i=q+1;g[i]==g[i+1];i++){
g[i]=g1;
}
g[i]=g1;
mx = max(mx,m[g[q]][0]*m[g[q]][1]);
}
ans.push_back(mx);
}
。
是否可以查詢同一個索引兩次? * n *和* q *的範圍是什麼? – trincot
是的,他們可以,但我相信它不會有任何區別。範圍從1到10^9爲n,從1到10^6爲q – user2980096