题目
给你个整数数组 arr
,其中每个元素都 不相同。
请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
示例
思路
寻找最小绝对差的元素对,并且按升序的顺序返回。
申请额外数组,保存最小绝对值差的元素
先对整数数组arr将其数组元素升序处理一下。
然后遍历整个数组,两两进行比较,将最小绝对差对保存
代码
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int cmp(const void * a, const void * b)
{
return *(int *)a - *(int *)b;
}
/*
*int** minimumAbsDifference(int* arr, int arrSize, int* returnSize, int** returnColumnSizes)
int** minimumAbsDifference:寻找数组中最小绝对差对
int* arr:数组
int arrSize:数组长度
int* returnSize:返回数组的行
int** returnColumnSizes:返回数组的列长
返回值:二维数组保存最小绝对差对
*/
int** minimumAbsDifference(int* arr, int arrSize, int* returnSize, int** returnColumnSizes){
qsort(arr, arrSize, sizeof(arr[0]), cmp);
int ** ans = (int **)malloc(sizeof(int *) * arrSize);//申请额外空间
*returnColumnSizes = (int *)malloc(sizeof(int) * arrSize);
int i = 0;
for(i = 0; i < arrSize; i++)//申请额外空间
{
ans[i] = (int *)malloc(sizeof(int) * 2);
(*returnColumnSizes)[i] = 2;
}
int min = INT_MAX;
*returnSize = 0;
for(i = 0; i < arrSize-1; i++)//遍历整个数组
{
if((arr[i+1] - arr[i]) < min)//保存最小绝对差
{
min = arr[i+1] - arr[i];
*returnSize = 0;
ans[(*returnSize)][0] = arr[i];
ans[(*returnSize)][1] = arr[i+1];
(*returnSize)++;
}
else if((arr[i+1] - arr[i]) == min)
{
ans[(*returnSize)][0] = arr[i];
ans[(*returnSize)][1] = arr[i+1];
(*returnSize)++;
}
}
return ans;
}
时间空间复杂度