Вы просто проходите массив, нет вложенного цикла рекурсивного вызова, поэтому O (n)
Хорошо, теперь я прочитал контекст, да уже поздно ^^
Или, конечно, худший случай, когда значения не отсортированы, потому что вам нужно просмотреть все значения, поэтому N ^ 3.Здесь массив отсортирован.
Но вы используете только цикл, и даже вы перезапускаете его это казалось волшебным ... слишком волшебным, извините, но это не сработает, у вас нетнайти решение, например, с вектором {4, 6, 11, 12, 14, 19} и ожидаемой суммой 36, но 6+11+19==36
Я не отвечаю о сложности, LC делает, носложность актуальна пока алгоритм не работает?Просто сделайте return 0;
со сложностью O (1) ^^
PS, потому что у меня были сомнения, я использовал брутальную силу , чтобы проверить
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/* function to find if there are 3 values in the
sorted array that sum up to a given sum */
int IsSumOf3( int arr[], size_t size, int sum)
{
int right, left, third;
right = size-1;
left = 0;
while(arr[right] > sum && right > 1)
{
--right;
}
if(right == 1)
{
/*printf("returned false on right == 1 \n");*/
return 0;
}
for(third = left+1; third < right; ++third)
{
int localSum = arr[right]+ arr[left]+ arr[third];
if(localSum == sum)
{
/*printf("right |%d|, left |%d|, third |%d|\n",arr[right], arr[left], arr[third]);*/
return 1;
}
if(localSum > sum)
{
--right;
left = 0;
third = left;
}
if(third+1 == right)
{
++left;
third = left;
}
}
/*printf("returned false on exit\n");*/
return 0;
}
int brutal(int arr[], size_t size, int sum)
{
int i,j,k;
for (i = 0; i != size - 2; ++i) {
for (j = i+1; j != size -1; ++j) {
for (k = j+1; k != size; ++k) {
if ((arr[i] + arr[j] + arr[k]) == sum) {
/*printf("%d %d %d\n", arr[i], arr[j], arr[k]);*/
return 1;
}
}
}
}
return 0;
}
int main()
{
#define N 6
int a[N];
srand(time(NULL));
for (;;) {
int i;
a[0] = rand() % N;
for (i = 1; i != N; ++i) {
a[i] = a[i - 1] + (rand() % (N - 1)) + 1; /* suppose must not be equals */
}
for (i = a[N-1] + a[N-2] + a[N-3] + 1; i != 0; i -= 1) {
if (IsSumOf3(a, N, i) != brutal(a, N, i)) {
int j;
for (j = 0; j != N; j++)
printf("%d ", a[j]);
printf(" / %d\n", i);
return 0;
}
}
}
return 0 ;
}