#include #include #include #include /** * Note: The returned array must be malloced, assume caller calls free(). */ int * findIndices(int* nums, int numsSize, int indexDifference, int valueDifference, int* returnSize) { int *ret = malloc(2*sizeof(int)); ret[0] = -1; ret[1] = -1; for ( int i = 0; i < numsSize; ++i ) { for ( int j = i; j < numsSize; ++j ) { if ( abs(i-j) < indexDifference ) { continue; } if ( abs(nums[i]-nums[j]) < valueDifference ) { continue; } ret[0] = i; ret[1] = j; goto exit; } } exit: *returnSize = 2; return ret; } char * list_to_cstr_temp(int *nums, int numsSize) { char *data = NULL; unsigned long size = 0; unsigned long cap = 1024; size = 0; if ( data == NULL ) { data = malloc(cap * sizeof(*data)); } memset(data, 0, cap); data[size++] = '['; for ( int i = 0; i < numsSize; ++i ) { if ( size + 2 >= cap ) { cap *= 2; data = realloc(data, cap); } if ( i > 0 ) { data[size++] = ','; } data[size++] = nums[i] + '0'; } data[size++] = ']'; data[size++] = '\0'; return data; } void r(int *nums, int numsSize, int indexDifference, int valueDifference, int *exp) { int t; char *numsCstr = list_to_cstr_temp(nums, numsSize); int *ret = findIndices(nums, numsSize, indexDifference, valueDifference, &t); char *retCstr = list_to_cstr_temp(ret, 2); char *expCstr = list_to_cstr_temp(exp, 2); printf("findIndices(%s, %d, %d, %d) = %s | exp: %s\n", numsCstr, numsSize, indexDifference, valueDifference, retCstr, expCstr); free(numsCstr); free(ret); free(retCstr); free(expCstr); } int main(void) { int nums1[] = {5,1,4,1}; int exp1[] = {0,3}; r(nums1, 4, 2, 4, exp1); int nums2[] = {2,1}; int exp2[] = {0,0}; r(nums2, 2, 0, 0, exp2); int nums3[] = {1,2,3}; int exp3[] = {-1,-1}; r(nums3, 3, 2, 4, exp3); return 0; }