【发布时间】:2018-01-31 18:17:16
【问题描述】:
我很难确定我的解决方案的时间复杂度。
任务是找到 An 序列的 n 值 - 1, 3, 5, 11, 21, 43...
A0 = 1
A1 = 3
An = (An-1)+2*(An-2)
序列“隐藏”在排序数组中。
例如下面的数组 -
1, 2, 3, 4, 5, 11, 17、21、40、65
将返回 4,因为 A4 = 21,而 21 是出现在给定数组中的序列的最后一个数字。
对于下一个数组 -
-3, -2, 0, 10, 11, 17, 21, 60
该方法将返回 -1,因为 A0 不在数组中。
我的代码:
public static int elements(int[] arr)
{
int i=1, j=3, k, tmp;
int a=-1;
tmp =indexOf(arr, i);
if(tmp==-1)
return a;
a++;
tmp=indexOf(arr,j);
if(tmp==-1)
return a;
a++;
k=(2*i)+j;
tmp=indexOf(arr,k);
while(tmp!=-1)
{
tmp=indexOf(arr,k);
a++;
i=j;
j=k;
k=(2*i)+j;
}
return a-1;
}
indexOf() 是 O(log n) 二进制搜索。
【问题讨论】:
-
我不确定
An的增长率在这里是否重要,因为在最坏的情况下,数组中的所有值都对应于系列中的一个术语,因此indexOf将是调用n + 1次(在最后一次到达结束后返回-1)。因此复杂度只是O(n log n)。如果您的问题实际上是关于An的增长率,Wolfram Alpha 说它是ϴ(2^n)。
标签: java time-complexity binary-search