使用贪婪策略的算法思想

时间:2014-07-29 20:53:19

标签: algorithm greedy

所以我刚刚完成考试,并且认为我会问你们一个让我难过的问题。我被要求在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)。有什么想法吗?

2 个答案:

答案 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,如果您还没有找到解决方案,那么就没有解决方案。