给出了一个N个整数序列。如何找到形成排列的相邻数字的最长子序列的长度。我只发现了O(N ^ 2)算法。我认为应该有O(NlogN)甚至是O(N)解决方案。请建议任何一个。
此序列1 3 1 2 5
的答案是3(4 1 3 1 2 5)
这是SPOJ问题LPERMUT。
O(N ^ 2)算法
Foreach i find the sum of first i elemetns: Sum(i)
Foreach i find the last element with indexes 1 .. i-1 which is equal to i-rd element: Prev(i)
Foreach i iterate j throw i+1 .. N while Prev(j) equals between i and j.
//So we get that all elemnent between i and j are distinct.
Then check if sum of them is equal to 1+2+...(j-i+1).
If it occurs that elements are permutation.
Sum of the elements between i and j we can get by Sum(j) - Sum(i-1)
答案 0 :(得分:-2)
您可以使用贪婪算法
Input: ListOfElements={el_1, el_2,...,el_N}
permutation<-{}
while(dimension(size(permutation)<DesiredSize)
{
while(VerifyIfIsPermutation(permutation U el)=false)
el<-SelectAnElementFromList(ListOfElements)
}
print permutation
该算法具有O(n ^ 2)复杂度。如果先前已排序的数组,您可以降低此复杂性 生成置换的另一种方法是对该列表使用随机shuffle。此外,您可以在元素之间使用多个旋转,从而保证不会重复生成的排列。