aboutsummaryrefslogtreecommitdiff
path: root/convert_1d_2d_arr.c
blob: e6359c4be394380c2a9378c9fb3202f4c1407015 (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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 2022. Convert 1D Array Into 2D Array
#include "leetcode.h"

/*
 * you are given a 0-indexed 1 dimensional integer array 'original' and two
 * integers 'm' and 'n'. you are tasked with creating a 2 dimensional array with
 * 'm' rows and 'n' columns using all the elements from 'original'. the elements
 * from indices 0 to 'n - 1' (inclusively) of 'original' should form the first
 * row of the constructed 2d array, the elments from indices 'n' to '2 * n - 1'
 * should form the second row of the constructed 2d array, and so on. return an
 * 'm * n' 2d array constructed according to the above procedure, or an empty 2d
 * array if it is not possible
 */

int **construct2DArray(int *original, int originalSize, int m, int n,
                       int *returnSize, int **returnColumnSizes) {
  int **ans = (int **)malloc(m * sizeof(int *));
  if (m * n != originalSize) {
    *returnSize = 0;
    free(ans);
    return NULL;
  }
  for (int i = 0; i < m; i++)
    ans[i] = (int *)malloc(sizeof(int *));
  *returnSize = m;
  *returnColumnSizes = (int *)malloc(m * sizeof(int));
  for (int i = 0, j = 0; i < m; i++) {
    for (int k = 0; k < n; k++) {
      ans[i][k] = original[j];
      j++;
    }
    (*returnColumnSizes)[i] = n;
  }
  return ans;
}

int main() {
  int o1[] = {1, 2, 3, 4}, o2[] = {1, 2, 3}, o3[] = {1, 2}, rs1, rs2, rs3,
      rcs1[] = {2, 2}, rcs2[] = {1}, rcs3[] = {};
  int **c2da1 = construct2DArray(o1, ARRAY_SIZE(o1), 2, 2, &rs1, (int **)rcs1);
  int **c2da2 = construct2DArray(o2, ARRAY_SIZE(o2), 1, 3, &rs2, (int **)rcs2);
  int **c2da3 = construct2DArray(o3, ARRAY_SIZE(o3), 1, 1, &rs3, (int **)rcs3);
  for (int i = 0; i < rs1; i++) {
    for (int j = 0; j < rcs1[i]; j++)
      printf("%d ", c2da1[i][j]);
    printf("\n");
    free(c2da1[i]);
  }
  printf("\n");
  for (int i = 0; i < rs2; i++) {
    for (int j = 0; j < rcs2[i]; j++)
      printf("%d ", c2da2[i][j]);
    free(c2da2[i]);
    printf("\n");
  }
  printf("\n");
  for (int i = 0; i < rs3; i++) {
    for (int j = 0; j < rcs3[i]; j++)
      printf("%d ", c2da3[i][j]);
    free(c2da3[i]);
    printf("\n");
  }
  printf("\n");
  free(c2da1), free(c2da2), free(c2da2);
}