通常的思路是O(N^3)
但可以有小小優(yōu)化:
一。先排序
二。枚舉i, j, k的時候,固定i的時候,j和k分別從左從右掃描數(shù)組,直到兩個碰到為止。
三。對于每個i,k從右掃描的開始位置是遞減的。
然后就有了下面的小程序:
#include <stdio.h>
#include <iostream>
#include <algorithm>

using namespace std;

int N = 10;
int K = 5;

int arr[] =
{1, 2, 5, 4, 5, 10, 2, 3, 5, 1};

int main()


{
int a, b, c, i;

sort(arr, arr + N);
c = N - 1;

for (a = 0; a < c; a++)
{

for (b = a + 1; b < c; b++)
{
while (c >= 0 && arr[a] + arr[b] + arr[c] > K)
c--;

for (i = c; b < i; b++)
{
while (i >= 0 && arr[a] + arr[b] + arr[i] > K)
i--;
if (i >= 0 && arr[a] + arr[b] + arr[i] == K)
printf("%d %d %d\n", arr[a], arr[b], arr[i]);
}
}
}

return 0;
}

