题目:
给你两个 二维 整数数组 nums1
和 nums2.
nums1[i] = [idi, vali]
表示编号为idi
的数字对应的值等于vali
。nums2[i] = [idi, vali]
表示编号为idi
的数字对应的值等于vali
。
每个数组都包含 互不相同 的 id ,并按 id 以 递增 顺序排列。
请你将两个数组合并为一个按 id 以递增顺序排列的数组,并符合下述条件:
- 只有在两个数组中至少出现过一次的 id 才能包含在结果数组内。
- 每个 id 在结果数组中 只能出现一次 ,并且其对应的值等于两个数组中该 id 所对应的值求和。如果某个数组中不存在该 id ,则假定其对应的值等于
0
。
返回结果数组。返回的数组需要按 id 以递增顺序排列。
思路:见代码
代码:
java
class Solution {
public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
List<int[]> list = new ArrayList<>();
int i = 0, j = 0;
int m = nums1.length;
int n = nums2.length;
while (i < m && j < n) {
// 如果两个id相等则值相加
if (nums1[i][0] == nums2[j][0]) {
list.add(new int[]{nums1[i][0], nums1[i][1] + nums2[j][1]});
i++;
j++;
}
// 如果哪边id更小,就将其塞入list中
while (i < m && j < n && nums1[i][0] < nums2[j][0]) {
list.add(nums1[i]);
i++;
}
while (i < m && j < n && nums2[j][0] < nums1[i][0]) {
list.add(nums2[j]);
j++;
}
}
// 补充剩余的数组
while (i < m) {
list.add(nums1[i]);
i++;
}
while (j < n) {
list.add(nums2[j]);
j++;
}
return list.toArray(new int[list.size()][]);
}
}
性能:
时间复杂度o(m+n)
空间复杂度o(1)