返回介绍

solution / 2500-2599 / 2570.Merge Two 2D Arrays by Summing Values / README

发布于 2024-06-17 01:03:04 字数 4859 浏览 0 评论 0 收藏 0

2570. 合并两个二维数组 - 求和法

English Version

题目描述

给你两个 二维 整数数组 nums1nums2.

  • nums1[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali
  • nums2[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali

每个数组都包含 互不相同 的 id ,并按 id 以 递增 顺序排列。

请你将两个数组合并为一个按 id 以递增顺序排列的数组,并符合下述条件:

  • 只有在两个数组中至少出现过一次的 id 才能包含在结果数组内。
  • 每个 id 在结果数组中 只能出现一次 ,并且其对应的值等于两个数组中该 id 所对应的值求和。如果某个数组中不存在该 id ,则认为其对应的值等于 0

返回结果数组。返回的数组需要按 id 以递增顺序排列。

 

示例 1:

输入:nums1 = [[1,2],[2,3],[4,5]], nums2 = [[1,4],[3,2],[4,1]]
输出:[[1,6],[2,3],[3,2],[4,6]]
解释:结果数组中包含以下元素:
- id = 1 ,对应的值等于 2 + 4 = 6 。
- id = 2 ,对应的值等于 3 。
- id = 3 ,对应的值等于 2 。
- id = 4 ,对应的值等于5 + 1 = 6 。

示例 2:

输入:nums1 = [[2,4],[3,6],[5,5]], nums2 = [[1,3],[4,3]]
输出:[[1,3],[2,4],[3,6],[4,3],[5,5]]
解释:不存在共同 id ,在结果数组中只需要包含每个 id 和其对应的值。

 

提示:

  • 1 <= nums1.length, nums2.length <= 200
  • nums1[i].length == nums2[j].length == 2
  • 1 <= idi, vali <= 1000
  • 数组中的 id 互不相同
  • 数据均按 id 以严格递增顺序排列

解法

方法一:计数 + 枚举

我们可以用一个哈希表或数组 cnt 统计两个数组中每个数字出现的次数。

然后我们从小到大枚举 cnt 中的每个数字,如果该数字出现的次数大于 $0$,则将其加入答案数组中。

时间复杂度 $O(n + m)$,空间复杂度 $O(M)$。其中 $n$ 和 $m$ 分别是两个数组的长度;而 $M$ 是两个数组中数字的最大值,本题中 $M = 1000$。

class Solution:
  def mergeArrays(
    self, nums1: List[List[int]], nums2: List[List[int]]
  ) -> List[List[int]]:
    cnt = Counter()
    for i, v in nums1 + nums2:
      cnt[i] += v
    return sorted(cnt.items())
class Solution {
  public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
    int[] cnt = new int[1001];
    for (var x : nums1) {
      cnt[x[0]] += x[1];
    }
    for (var x : nums2) {
      cnt[x[0]] += x[1];
    }
    int n = 0;
    for (int i = 0; i < 1001; ++i) {
      if (cnt[i] > 0) {
        ++n;
      }
    }
    int[][] ans = new int[n][2];
    for (int i = 0, j = 0; i < 1001; ++i) {
      if (cnt[i] > 0) {
        ans[j++] = new int[] {i, cnt[i]};
      }
    }
    return ans;
  }
}
class Solution {
public:
  vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) {
    int cnt[1001]{};
    for (auto& x : nums1) {
      cnt[x[0]] += x[1];
    }
    for (auto& x : nums2) {
      cnt[x[0]] += x[1];
    }
    vector<vector<int>> ans;
    for (int i = 0; i < 1001; ++i) {
      if (cnt[i]) {
        ans.push_back({i, cnt[i]});
      }
    }
    return ans;
  }
};
func mergeArrays(nums1 [][]int, nums2 [][]int) (ans [][]int) {
  cnt := [1001]int{}
  for _, x := range nums1 {
    cnt[x[0]] += x[1]
  }
  for _, x := range nums2 {
    cnt[x[0]] += x[1]
  }
  for i, x := range cnt {
    if x > 0 {
      ans = append(ans, []int{i, x})
    }
  }
  return
}
function mergeArrays(nums1: number[][], nums2: number[][]): number[][] {
  const n = 1001;
  const cnt = new Array(n).fill(0);
  for (const [a, b] of nums1) {
    cnt[a] += b;
  }
  for (const [a, b] of nums2) {
    cnt[a] += b;
  }
  const ans: number[][] = [];
  for (let i = 0; i < n; ++i) {
    if (cnt[i] > 0) {
      ans.push([i, cnt[i]]);
    }
  }
  return ans;
}
impl Solution {
  pub fn merge_arrays(nums1: Vec<Vec<i32>>, nums2: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
    let mut cnt = vec![0; 1001];

    for x in &nums1 {
      cnt[x[0] as usize] += x[1];
    }

    for x in &nums2 {
      cnt[x[0] as usize] += x[1];
    }

    let mut ans = vec![];
    for i in 0..cnt.len() {
      if cnt[i] > 0 {
        ans.push(vec![i as i32, cnt[i] as i32]);
      }
    }

    ans
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文