所以我刚刚完成考试,并且认为我会问你们一个让我难过的问题。我被要求在n个数字的递增数组上使用greedy strategy
来提出算法思想,其中A[i] + A[j] = T
。 T只是一个数字,用于查看两个数字是否相加。我们要保持O(n)
。我不确定如何正确地做到这一点。
我建议的方法是A[i] + A[j] > T
如果不是那么A[i + 1] + A[j + 1]
,直到你找到一个大于T的答案。一旦你发现它大于T你就会去从A [0]到A [j-1]并查看它是否与任何情况相匹配。我不认为我的想法是O(n)。有什么想法吗?
答案 0 :(得分:3)
这个想法是,对于从列表末尾开始的A [i]的每个大值,你将搜索较小的j值,使得A [i] + A [j] = T,如果这样的话存在。如果数组是无序的,那么这将是一个O(n ^ 2)循环嵌套。
贪婪的部分是你永远不需要用j的值“向后”,因为A的值是递增的。即当减小i的值时,j的所有可能正确值必须大于当前值。
在代码中:
i = n - 1;
j = 0;
while (j <= i)
if (A[i] + A[j] < T)
j++;
else if (A[i] + A[j] > T)
i--;
else {
printf("A[%d] + A[%d] = %d\n", i, j, T);
break;
}
答案 1 :(得分:3)
我不确定这是否完全符合贪婪策略,但此问题的标准解决方案是维护左索引L和右索引R.最初将这些设置为1和n。如果A [L] + A [R] <然后T将L增加1.如果A [L] + A [R]> T然后将R减少1.一旦达到L = R,如果您还没有找到解决方案,那么就没有解决方案。