2570. 合并两个二维数组 - 求和法
题目链接:
2570. 合并两个二维数组 - 求和法
题目描述:
给你两个 二维 整数数组 nums1
和 nums2.
nums1[i] = [idi, vali]
表示编号为idi
的数字对应的值等于vali
。nums2[i] = [idi, vali]
表示编号为idi
的数字对应的值等于vali
。
每个数组都包含 互不相同 的 id ,并按 id 以 递增 顺序排列。
请你将两个数组合并为一个按 id 以递增顺序排列的数组,并符合下述条件:
- 只有在两个数组中至少出现过一次的 id 才能包含在结果数组内。
- 每个 id 在结果数组中 只能出现一次 ,并且其对应的值等于两个数组中该 id 所对应的值求和。如果某个数组中不存在该 id ,则假定其对应的值等于
0
。
返回结果数组。返回的数组需要按 id 以递增顺序排列。
题目分析:
该题用于理解二维数组,使用双指针进行赋值
题解:
// 方法1:指针
/*** 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** mergeArrays(int** nums1, int nums1Size, int* nums1ColSize, int** nums2, int nums2Size, int* nums2ColSize, int* returnSize, int** returnColumnSizes) {// 返回数组,大小为num1Size+num2Sizesint** array = malloc(sizeof(int *) * (nums1Size + nums2Size));// 返回的列大小,只有一行,全为2*returnColumnSizes = malloc(sizeof(int) * (nums1Size + nums2Size));// 行指针p1指向nums1int** p1 = nums1;// 行指针p2指向nums2int** p2 = nums2;// 计数,返回的数组大小int cnt = 0;// 双指针赋值while(p1 < nums1 + nums1Size && p2 < nums2 + nums2Size){// 为当前行分配空间array[cnt] = malloc(sizeof(int) * 2);// 当前行的列数为2(*returnColumnSizes)[cnt] = 2;// 相等就先相加,再赋值,指针++,cnt++if ((*p1)[0] == (*p2)[0]) {array[cnt][0] = (*p1)[0];array[cnt][1] = (*p1)[1] + (*p2)[1];cnt++;p1++;p2++;}else if((*p1)[0] > (*p2)[0]){array[cnt][0] = (*p2)[0];array[cnt][1] = (*p2)[1];cnt++;p2++;}else{array[cnt][0] = (*p1)[0];array[cnt][1] = (*p1)[1];cnt++;p1++;}}// 若nums1未完全进入返回数组,则将剩余的添加到返回数组while(p1 < nums1 + nums1Size){array[cnt] = malloc(sizeof(int) * 2);(*returnColumnSizes)[cnt] = 2;array[cnt][0] = (*p1)[0];array[cnt][1] = (*p1)[1];cnt++;p1++;}// 若nums1未完全进入返回数组,则将剩余的添加到返回数组while(p2 < nums2 + nums2Size){array[cnt] = malloc(sizeof(int) * 2);(*returnColumnSizes)[cnt] = 2;array[cnt][0] = (*p2)[0];array[cnt][1] = (*p2)[1];cnt++;p2++;}// 返回数组大小为cnt*returnSize = cnt;return array;
}// 方法2:索引
/*** 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** mergeArrays(int** nums1, int nums1Size, int* nums1ColSize, int** nums2, int nums2Size, int* nums2ColSize, int* returnSize, int** returnColumnSizes) {int** array = malloc(sizeof(int *) * (nums1Size + nums2Size));*returnColumnSizes = malloc(sizeof(int) * (nums1Size + nums2Size));int p1 = 0;int p2 = 0;int cnt = 0;while(p1 < nums1Size && p2 < nums2Size){array[cnt] = malloc(sizeof(int) * 2);(*returnColumnSizes)[cnt] = 2;if(nums1[p1][0] == nums2[p2][0]){array[cnt][0] = nums1[p1][0];array[cnt][1] = nums1[p1][1] + nums2[p2][1];cnt++;p1++;p2++;}else if(nums1[p1][0] > nums2[p2][0]){array[cnt][0] = nums2[p2][0];array[cnt][1] = nums2[p2][1];cnt++;p2++;}else{array[cnt][0] = nums1[p1][0];array[cnt][1] = nums1[p1][1];cnt++;p1++;}}while(p1 < nums1Size){array[cnt] = malloc(sizeof(int) * 2);(*returnColumnSizes)[cnt] = 2;array[cnt][0] = nums1[p1][0];array[cnt][1] = nums1[p1][1];cnt++;p1++;}while(p2 < nums2Size){array[cnt] = malloc(sizeof(int) * 2);(*returnColumnSizes)[cnt] = 2;array[cnt][0] = nums2[p2][0];array[cnt][1] = nums2[p2][1];cnt++;p2++;}*returnSize = cnt;return array;
}