Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int cmp(const void *a, const void *b) {
- return *(int *)a - *(int *)b;
- }
- int* avoidFlood(int* rains, int rainsSize, int* returnSize) {
- int *result = (int *)malloc(sizeof(int) * rainsSize);
- int *nextRain = (int *)malloc(sizeof(int) * rainsSize);
- int *fullLakes = (int *)malloc(sizeof(int) * rainsSize);
- int fullLakesSize = 0, nextRainSize = 0;
- memset(result, 0, sizeof(int) * rainsSize);
- memset(nextRain, 0, sizeof(int) * rainsSize);
- memset(fullLakes, 0, sizeof(int) * rainsSize);
- for (int i = 0; i < rainsSize; i++) {
- if (rains[i] > 0) {
- for (int j = 0; j < fullLakesSize; j++) {
- if (fullLakes[j] == rains[i]) {
- *returnSize = 0;
- return NULL;
- }
- }
- fullLakes[fullLakesSize++] = rains[i];
- nextRain[nextRainSize++] = i;
- result[i] = -1;
- } else {
- if (nextRainSize == 0) {
- result[i] = 1;
- } else {
- qsort(nextRain, nextRainSize, sizeof(int), cmp);
- int lakeToDry = -1;
- for (int j = 0; j < nextRainSize; j++) {
- if (rains[nextRain[j]] > 0) {
- lakeToDry = rains[nextRain[j]];
- break;
- }
- }
- if (lakeToDry == -1) {
- result[i] = 1;
- } else {
- result[i] = lakeToDry;
- for (int j = 0; j < fullLakesSize; j++) {
- if (fullLakes[j] == lakeToDry) {
- fullLakes[j] = fullLakes[--fullLakesSize];
- break;
- }
- }
- for (int j = 0; j < nextRainSize; j++) {
- if (rains[nextRain[j]] == lakeToDry) {
- nextRain[j] = nextRain[--nextRainSize];
- break;
- }
- }
- }
- }
- }
- }
- *returnSize = rainsSize;
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment