给定长度为n的数组,对于每个索引,我有一个整数xi(xi <= i)。我需要计算包含这两个指数的所有连续子序列,也就是说不应该重复。 我已经计算了子序列[1,4]为(i = 4&amp;&amp; x4 = 0),然后如果为next(i = 5&amp;&amp; x5 = 1)我不应该包括相同的连续序列两次。我需要找到所有这些子序列的数量。我试过蛮力的方法,不足以打败时间。
我可以有更好的方法吗?可能是O(NLOGN)还是不到那个?
答案 0 :(得分:1)
解决方案非常简单明了。
假设我们正在为索引i。
执行此操作我们通过将子序列扩展到限制(索引) x [i] 和 i 之后生成子序列,因为子序列将始终从获取数组的元素x [i]到i ,如果我们只展开,我们的subsequnce将始终具有指数 x [i] 和 i 。
但是,当然,我们还将涵盖从 x [i] 到 i 的明显子序列,这是第一个子序列。
编辑:为避免重复,我们必须检查左边界和右边界的给定组合是否已经尝试。
为此,我们将制作邻接列表,其中包含
N个链接列表。
并且所有链接列表最初都是空的。
现在,之前没有尝试过具有相应左右边界的给定子序列,当且仅当
linked list arr[left] does not contain element right.
如果链接列表arr [left]包含右边的元素,则表示之前已打印过子序列。
首先我们将子序列的左边界固定为x [i],然后使用新的左边界我们尝试所有可能的新右边界:
i,i+1,i+2 ....... N-1 , N is equal to length of array a.
Corresponding subsequenes being
if(a[j] linked list does not contain i)
{
print the subsequence a[j],a[j+1],......a[i]
add i to arr[j]
}
if(a[j] linked list does not contain i+1)
{
print the subsequence a[j],a[j+1],.........a[i+1]
add i+1 to a[j]
}
and similar if condition before all subsequences given below.
a[j],a[j+1],...............a[i+2]
.
.
a[j],a[j+1]..........................a[N-1]
j is x[i] for the above subsequences.
然后我们将左边界固定为x [i] -1,然后使用新的左边界我们尝试所有可能的新右边界:
i,i+1,i+2 ....... N-1
相应的子结构
similar if condition as given above before all subsequences given below.
and they will be printed if and only if the condition is true.
a[j],a[j+1],.........a[i]
a[j],a[j+1],...............a[i+1]
.
.
a[j],a[j+1]..........................a[N-1]
j is x[i]-1 for the above subsequences.
我们这样做,直到j变为0,这将是最后一次迭代。
现在提高了这个算法的效率,因为在每一步我都会生成一个新的子序列,并且没有一个步骤浪费在产生不包含两个索引的子序列中,所以我认为它非常有效。