
About the author
Mallikarjuna Mallisetty
General programming
Mallikarjuna shares practical programming tutorials and foundational concepts designed to help developers learn by building and experimenting.
View LinkedIn profile ↗#include <stdio.h>
#include <stdlib.h>
int find(int parent[], int i) {
if (parent[i] == -1) return i;
return parent[i] = find(parent, parent[i]);
}
int unionSets(int parent[], int x, int y) {
int xset = find(parent, x);
int yset = find(parent, y);
if (xset != yset) {
parent[xset] = yset;
return 1;
}
return 0;
}
int* numIslands2(int n, int m, int operators[][2], int k, int* returnSize) {
int* parent = (int*)malloc(sizeof(int) * n * m);
for (int i = 0; i < n * m; i++) parent[i] = -1;
int* grid = (int*)calloc(n * m, sizeof(int));
int* result = (int*)malloc(sizeof(int) * k);
int count = 0;
int directions[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
for (int i = 0; i < k; i++) {
int r = operators[i][0], c = operators[i][1];
int id = r * m + c;
if (grid[id] == 1) {
result[i] = count;
continue;
}
grid[id] = 1;
count++;
for (int d = 0; d < 4; d++) {
int nr = r + directions[d][0], nc = c + directions[d][1];
int nid = nr * m + nc;
if (nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nid] == 1) {
if (unionSets(parent, id, nid)) count--;
}
}
result[i] = count;
}
free(parent);
free(grid);
*returnSize = k;
return result;
}
int main() {
int operators[][2] = {{0,0}, {0,1}, {1,2}, {2,1}};
int returnSize = 0;
int* res = numIslands2(3, 3, operators, 4, &returnSize);
for (int i = 0; i < returnSize; i++) {
printf("%d ", res[i]);
}
printf("\n");
free(res);
return 0;
}