aboutsummaryrefslogtreecommitdiff
path: root/find_lonely_numbers_array.c
blob: b3346536d59ba5400611b6f4b865049763e6c68e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 2150. Find All Lonely Numbers in the Array
#include "leetcode.h"

/*
 * you are given an integer array 'nums'. a number 'x' is lonely when it appears
 * only once, and no adjacent numbers (ie. 'x + 1' and 'x - 1') appear in the
 * array. return all lonely numbers in 'nums'. you may return the answer in any
 * order
 */

int *findLonely(int *nums, int numsSize, int *returnSize) {
  int arr[1000002] = {0};
  for (int i = 0; i < numsSize; i++)
    arr[nums[i]]++;
  *returnSize = 0;
  int *ans = (int *)malloc(numsSize * sizeof(int));
  for (int i = 0; i < numsSize; i++) {
    if (!nums[i] && arr[nums[i]] == 1 && !arr[nums[i] + 1]) {
      ans[(*returnSize)++] = nums[i];
      continue;
    }
    if (arr[nums[i]] == 1 && !arr[nums[i] + 1] && !arr[nums[i] - 1])
      ans[(*returnSize)++] = nums[i];
  }
  return ans;
}

int main() {
  int n1[] = {10, 6, 5, 8}, n2[] = {1, 3, 5, 3}, rs1, rs2;
  int *fl1 = findLonely(n1, ARRAY_SIZE(n1), &rs1);
  int *fl2 = findLonely(n2, ARRAY_SIZE(n2), &rs2);
  for (int i = 0; i < rs1; i++)
    printf("%d ", fl1[i]); // expect: 10 8
  printf("\n");
  for (int i = 0; i < rs2; i++)
    printf("%d ", fl2[i]); // expect: 1 5
  printf("\n");
  free(fl1), free(fl2);
}