现在我有N个不同的整数,我需要找到一个区间,在O(NlogN)时间内具有最多数量的数字,这些数字的值在区间的端点之间。我称之为“分治”问题,因为它属于我的期末考试的“分治”类别。我已经思考了两周,并进行了许多实验,但都没有得出正确的答案(与暴力算法相比)。有人能帮帮我吗?
例子:
8,1,3,4,7。答案是1-7。
2,6,5,4,9,8。答案是2-9或2-8。
我认为“区间”这个词并不能表达我的意思。我的意思是找到一个子序列,其中有最多的数字的值在子序列的端点之间。例如1:“1,3,4,7”有两个数字(3,4),例如2:无论是“2,6,5,4,9”还是“2,6,5,4,9,8”,都有三个数字(6,5,4)。
以下是我的代码(O(n^2))。@Vaughn Cato 我使用这个代码来与你的代码进行比较。
例子:
8,1,3,4,7。答案是1-7。
2,6,5,4,9,8。答案是2-9或2-8。
我认为“区间”这个词并不能表达我的意思。我的意思是找到一个子序列,其中有最多的数字的值在子序列的端点之间。例如1:“1,3,4,7”有两个数字(3,4),例如2:无论是“2,6,5,4,9”还是“2,6,5,4,9,8”,都有三个数字(6,5,4)。
以下是我的代码(O(n^2))。@Vaughn Cato 我使用这个代码来与你的代码进行比较。
#! /usr/bin/env python
#coding=utf-8
import itertools
def n2(numbers):
a = [0]*len(numbers)
ans = -1
l = 0
r = 0
for j in range(1,len(numbers)):
t = 0
for i in range(j-1,-1,-1):
if numbers[i]<numbers[j]:
x = t - a[i]
if x>ans:
ans = x
l = i
r = j
t += 1
else:
a[i] += 1
return (numbers[l],numbers[r],ans)
def countBetween(numbers,left,right):
cnt = 0
for i in range(left+1,right):
if numbers[left]<numbers[i]<numbers[right]:
cnt += 1
return cnt
for numbers in itertools.permutations(range(5)):
ans1=n2(numbers)
ans2=longestInterval(numbers)
if(ans1[2]!=ans2[2]):
print ans1,ans2,numbers