假设Array[10] = {10,6,11,9,-18,0,91,18,24,32}
最大的序列为10,11,18,24,32
或-18,0,18,24,32
对此的解决方案是制作另一个Array[10]
,它将存储序列数。从仅产生1个序列的最后一个元素32开始,即数字本身。
24使2
18使3
91使1
0使4
-18使5
9使4
11使4
6使4
10使得5
输出应该是从-18开始的5或从10开始的5。
请有人帮我解决这个问题。
答案 0 :(得分:0)
或多或少看起来像这样,现在你需要将它翻译成你正在使用的语言
largestSequience = [];
temporaryArray = [];
for (element in array)
{
if (temporatySize not empty and temporarySize[lastElement]>=element)
{
if (temporaryArray.length > largestSequence.length) largestSequence = temporaryArray;
temporaryArray = [element]
}
temporaryArray.add(element)
}
答案 1 :(得分:0)
你想要的C ++。运行时间为O(NlogN),其中N是Array []
的大小#include<stdio.h>
#include<map>
using namespace std;
int main(void) {
int Array[10] = {10,6,11,9,-18,0,91,18,24,32};
int p[10],next[10];
int i,j,n=10;
map<int,int> places;
for(i=n;i>=0;i--){
map<int,int>::iterator ii=places.upper_bound(Array[i]);
if(ii==places.end()){ //no item on the right is larger
p[i]=1;
next[i]=-1;
}else{
next[i]=ii->second;
p[i]=p[ii->second]+1;
}
places[Array[i]]=i;
ii=places.find(Array[i]);
while(ii!=places.begin()){
ii--;
if(p[ii->second]<=p[i]){
places.erase(ii);
}else
break;
ii=places.find(Array[i]);
}
}
int longestI=0;
for(i=1;i<n;i++){
if(p[i]>p[longestI])
longestI=i;
}
for(i=longestI;i>=0;i=next[i]){
printf("%d\n",Array[i]);
}
return 0;
}