返回介绍

solution / 2400-2499 / 2482.Difference Between Ones and Zeros in Row and Column / README

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

2482. 行和列中一和零的差值

English Version

题目描述

给你一个下标从 0 开始的 m x n 二进制矩阵 grid 。

我们按照如下过程,定义一个下标从 0 开始的 m x n 差值矩阵 diff :

  • 令第 i 行一的数目为 onesRowi 。
  • 令第 j 列一的数目为 onesColj 
  • 令第 i 行零的数目为 zerosRowi 。
  • 令第 j 列零的数目为 zerosColj 。
  • diff[i][j] = onesRowi + onesColj - zerosRowi - zerosColj

请你返回差值矩阵_ _diff 。

 

示例 1:

输入:grid = [[0,1,1],[1,0,1],[0,0,1]]
输出:[[0,0,4],[0,0,4],[-2,-2,2]]
解释:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 2 + 1 - 1 - 2 = 0 
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 2 + 1 - 1 - 2 = 0 
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 2 + 3 - 1 - 0 = 4 
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 2 + 1 - 1 - 2 = 0 
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 2 + 1 - 1 - 2 = 0 
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 2 + 3 - 1 - 0 = 4 
- diff[2][0] = onesRow2 + onesCol0 - zerosRow2 - zerosCol0 = 1 + 1 - 2 - 2 = -2
- diff[2][1] = onesRow2 + onesCol1 - zerosRow2 - zerosCol1 = 1 + 1 - 2 - 2 = -2
- diff[2][2] = onesRow2 + onesCol2 - zerosRow2 - zerosCol2 = 1 + 3 - 2 - 0 = 2

示例 2:

输入:grid = [[1,1,1],[1,1,1]]
输出:[[5,5,5],[5,5,5]]
解释:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 3 + 2 - 0 - 0 = 5
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 3 + 2 - 0 - 0 = 5
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 3 + 2 - 0 - 0 = 5
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 3 + 2 - 0 - 0 = 5
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 3 + 2 - 0 - 0 = 5
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 3 + 2 - 0 - 0 = 5

 

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 105
  • 1 <= m * n <= 105
  • grid[i][j] 要么是 0 ,要么是 1

解法

方法一:模拟

根据题意模拟即可。

时间复杂度 $O(m \times n)$,忽略答案的空间消耗,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。

class Solution:
  def onesMinusZeros(self, grid: List[List[int]]) -> List[List[int]]:
    m, n = len(grid), len(grid[0])
    rows = [0] * m
    cols = [0] * n
    for i, row in enumerate(grid):
      for j, v in enumerate(row):
        rows[i] += v
        cols[j] += v
    diff = [[0] * n for _ in range(m)]
    for i, r in enumerate(rows):
      for j, c in enumerate(cols):
        diff[i][j] = r + c - (n - r) - (m - c)
    return diff
class Solution {
  public int[][] onesMinusZeros(int[][] grid) {
    int m = grid.length, n = grid[0].length;
    int[] rows = new int[m];
    int[] cols = new int[n];
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        int v = grid[i][j];
        rows[i] += v;
        cols[j] += v;
      }
    }
    int[][] diff = new int[m][n];
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        diff[i][j] = rows[i] + cols[j] - (n - rows[i]) - (m - cols[j]);
      }
    }
    return diff;
  }
}
class Solution {
public:
  vector<vector<int>> onesMinusZeros(vector<vector<int>>& grid) {
    int m = grid.size(), n = grid[0].size();
    vector<int> rows(m);
    vector<int> cols(n);
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        int v = grid[i][j];
        rows[i] += v;
        cols[j] += v;
      }
    }
    vector<vector<int>> diff(m, vector<int>(n));
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        diff[i][j] = rows[i] + cols[j] - (n - rows[i]) - (m - cols[j]);
      }
    }
    return diff;
  }
};
func onesMinusZeros(grid [][]int) [][]int {
  m, n := len(grid), len(grid[0])
  rows := make([]int, m)
  cols := make([]int, n)
  diff := make([][]int, m)
  for i, row := range grid {
    diff[i] = make([]int, n)
    for j, v := range row {
      rows[i] += v
      cols[j] += v
    }
  }
  for i, r := range rows {
    for j, c := range cols {
      diff[i][j] = r + c - (n - r) - (m - c)
    }
  }
  return diff
}
function onesMinusZeros(grid: number[][]): number[][] {
  const m = grid.length;
  const n = grid[0].length;
  const rows = new Array(m).fill(0);
  const cols = new Array(n).fill(0);
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (grid[i][j]) {
        rows[i]++;
        cols[j]++;
      }
    }
  }
  const ans = Array.from({ length: m }, () => new Array(n).fill(0));
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      ans[i][j] = rows[i] + cols[j] - (m - rows[i]) - (n - cols[j]);
    }
  }
  return ans;
}
impl Solution {
  pub fn ones_minus_zeros(grid: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
    let m = grid.len();
    let n = grid[0].len();
    let mut rows = vec![0; m];
    let mut cols = vec![0; n];
    for i in 0..m {
      for j in 0..n {
        if grid[i][j] == 1 {
          rows[i] += 1;
          cols[j] += 1;
        }
      }
    }
    let mut ans = vec![vec![0; n]; m];
    for i in 0..m {
      for j in 0..n {
        ans[i][j] = (rows[i] + cols[j] - (m - rows[i]) - (n - cols[j])) as i32;
      }
    }
    ans
  }
}
/**
 * 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** onesMinusZeros(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes) {
  int* rows = malloc(sizeof(int) * gridSize);
  int* cols = malloc(sizeof(int) * gridColSize[0]);
  memset(rows, 0, sizeof(int) * gridSize);
  memset(cols, 0, sizeof(int) * gridColSize[0]);
  for (int i = 0; i < gridSize; i++) {
    for (int j = 0; j < gridColSize[0]; j++) {
      if (grid[i][j]) {
        rows[i]++;
        cols[j]++;
      }
    }
  }
  int** ans = malloc(sizeof(int*) * gridSize);
  for (int i = 0; i < gridSize; i++) {
    ans[i] = malloc(sizeof(int) * gridColSize[0]);
    for (int j = 0; j < gridColSize[0]; j++) {
      ans[i][j] = rows[i] + cols[j] - (gridSize - rows[i]) - (gridColSize[0] - cols[j]);
    }
  }
  *returnSize = gridSize;
  *returnColumnSizes = gridColSize;
  return ans;
}

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

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

发布评论

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