找到未排序数组中最长的升序数序列

时间:2012-08-13 10:23:40

标签: arrays

假设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。

请有人帮我解决这个问题。

2 个答案:

答案 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;

}