leetcode/src/2711.c
2025-03-25 18:02:30 +08:00

77 lines
2.5 KiB
C

#include <assert.h>
#include <solution/2711.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int differentElementNum(int *elem, int size)
{
int sum = 0;
int *temp = NULL;
for (int i = 0; i < size; i++)
{
bool flag = true;
// check same elem
for (int j = 0; j < sum; j++)
if (elem[i] == temp[j])
flag = false;
// if not in temp, add to temp
if (flag)
{
temp = realloc(temp, ++sum * sizeof(int));
temp[sum - 1] = elem[i];
}
}
free(temp);
return sum;
}
/**
* 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 **differenceOfDistinctValues(int **grid, int gridSize, int *gridColSize, int *returnSize, int **returnColumnSizes)
{
int **answer = (int **)malloc(sizeof(int *) * gridSize);
*returnColumnSizes = (int *)malloc(gridSize * sizeof(int));
for (int r = 0; r < gridSize; r++)
{
answer[r] = (int *)malloc(sizeof(int) * gridColSize[r]);
(*returnColumnSizes)[r] = gridColSize[r];
for (int c = 0; c < gridColSize[r]; c++)
{
// calc topLeft array
int *topLeftElements = NULL;
int topLeftSize = 0;
int topLeft = 0;
for (int x = r - 1, y = c - 1; x >= 0 && y >= 0; x--, y--)
{
// add element to array
topLeftElements = realloc(topLeftElements, ++topLeftSize * sizeof(int));
topLeftElements[topLeftSize - 1] = grid[x][y];
}
topLeft = differentElementNum(topLeftElements, topLeftSize);
// calc bottomRight array
int *bottomRightElements = NULL;
int bottomRightSize = 0;
int bottomRight = 0;
for (int x = r + 1, y = c + 1; x < gridSize && y < gridColSize[r]; x++, y++)
{
bottomRightElements = realloc(bottomRightElements, ++bottomRightSize * sizeof(int));
bottomRightElements[bottomRightSize - 1] = grid[x][y];
}
bottomRight = differentElementNum(bottomRightElements, bottomRightSize);
answer[r][c] = abs(topLeft - bottomRight);
free(bottomRightElements);
free(topLeftElements);
}
}
*returnSize = gridSize;
return answer;
}