我有一个未排序的数组,需要提取最长的排序元素序列。 例如
A = 2,4,1,7,4,5,0,8,65,4,2,34
这里0,8,65是我的目标序列
我需要跟踪此序列开始的索引
答案 0 :(得分:7)
您可以使用此算法在线性时间O(N)
中执行此操作:构建与原始向量相同大小len
的向量N
,以便len[i]
包含长度元素seq[i]
所属的最长连续递增运行。
len[i]
的值可以按如下方式计算:
len[0] = 1;
for (int i = 1 ; i != N ; i++) {
len[i] = seq[i-1] >= seq[i] ? 1 : len[i-1]+1;
}
手持len
,找到max(len)
元素的索引。这是您运行的最后一个元素。追溯到len[j] == 1
以查找运行的初始元素。
seq len
--- ---
2 1
4 2
1 1
7 2
4 1
5 2
0 1
8 2
65 3 << MAX
4 1
2 1
34 2
请注意,在算法的每个步骤中,您只需要元素len[i-1]
来计算len
,因此您可以通过删除len
的向量表示并保持优先级来优化常量空间一,max_len
和max_len_index
。
这是针对恒定空间优化的算法。变量len
代表线性空间算法中的len[i-1]
。
int len = 1, pos = 0, maxlen = 1, current_start = 0;
for (int i = 1 ; i < seq.size() ; i++) {
if (seq[i] > seq[i-1]) {
len++;
if (len > maxlen) {
maxlen = len;
pos = current_start;
}
} else {
len = 1;
current_start = i;
}
}
答案 1 :(得分:5)
您需要4个索引(begin,end,tmp_begin,tmp_end)。使用tmp_begin
,tmp_end
作为工作索引迭代原始数组,每次找到更长的排序序列更新begin
和end
索引。
要检查子序列是否已排序,您必须检查i中的元素是否大于i--中的元素 - 对于子序列中的每对连续项目。
最后:打印原始数组中从begin
开始到end
结束的所有元素。
答案 2 :(得分:1)
for(int i=0;i<size_of_array;i++)
{
iterate++;
after=array[iterate];
if(after>before) {current_counter++;} else {current_counter=0;}
if(max_counter<current_counter) max_counter=current_counter;
before=array[iterate];
}
printf(" maximum length=%i ",max_counter);