定长列表(数组),原地修改,2 解法求解《1582. 二进制矩阵中的特殊位置》

2022-09-04 02:46:50
定长列表(数组),原地修改,Python 使用 zip 旋转矩阵,2 解法求解《1582. 二进制矩阵中的特殊位置》

例题

1582. 二进制矩阵中的特殊位置

给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。
特殊位置 定义:如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置 (i, j) 被称为特殊位置。
示例 1:
输入:mat = [[1,0,0],
[0,0,1],
[1,0,0]]
输出:1
解释:(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
示例 2:
输入:mat = [[1,0,0],
[0,1,0],
[0,0,1]]
输出:3
解释:(0,0), (1,1) 和 (2,2) 都是特殊位置
示例 3:
输入:mat = [[0,0,0,1],
[1,0,0,0],
[0,1,1,0],
[0,0,0,0]]
输出:2
示例 4: 输入:mat = [[0,0,0,0,0],
[1,0,0,0,0],
[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]]
输出:3
提示:
rows == mat.length
cols == mat[i].length
1 <= rows, cols <= 100
mat[i][j] 是 0 或 1

答案

定长列表(数组)

var numSpecial = function(mat) {
  const m = mat.length, n = mat[0].length
  const rows = new Uint8Array(m), cols = new Uint8Array(n)
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1) rows[i]++, cols[j]++
    }
  }
  let r = 0
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1 && rows[i] === 1 && cols[j] === 1) r++
    }
  }
  return r
};
function numSpecial(mat: number[][]): number {
  const m = mat.length, n = mat[0].length
  const rows = new Uint8Array(m), cols = new Uint8Array(n)
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1) rows[i]++, cols[j]++
    }
  }
  let r = 0
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1 && rows[i] === 1 && cols[j] === 1) r++ 
    }
  }
  return r
};
class Solution {
  function numSpecial($mat) {
    $m = count($mat);
    $n = count($mat[0]);
    $rows = array_fill(0, $m, 0);
    $cols = array_fill(0, $n, 0);
    foreach ($mat as $i => $row) {
      foreach ($row as $j => $v) {
        if ($v === 1) {
          $rows[$i]++;
          $cols[$j]++;
        }
      }
    }
    $r = 0;
    foreach ($mat as $i => $row) {
      foreach ($row as $j => $v) {
        if ($v === 1 && $rows[$i] === 1 && $cols[$j] === 1) $r++;
      }
    }
    return $r;
  }
}
func numSpecial(mat [][]int) int {
  m, n, r := len(mat), len(mat[0]), 0
  rows, cols := make([]int, m), make([]int, n)
  for i, row := range mat {
    for j, v := range row {
      if v == 1 {
        rows[i]++
        cols[j]++
      }
    }
  }
  for i, row := range mat {
    for j, v := range row {
        if v == 1 && rows[i] == 1 && cols[j] == 1 {
          r++
        }
    }
  }
  return r
}
class Solution {
  public int numSpecial(int[][] mat) {
    int m = mat.length, n = mat[0].length, r = 0;
    int[] rows = new int[m], cols = new int[n];
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1) {
          rows[i]++;
          cols[j]++;
        }
      }
    }
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1 && rows[i] == 1 && cols[j] == 1) r++;
      }
    }
    return r;
  }
}
public class Solution {
  public int NumSpecial(int[][] mat) {
    int m = mat.Length, n = mat[0].Length, r = 0;
    int[] rows = new int[m], cols = new int[n];
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1) {
          rows[i]++;
          cols[j]++;
        }
      }
    }
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1 && rows[i] == 1 && cols[j] == 1) {
          r++;
        }
      }
    }
    return r;
  }
}
int numSpecial(int** mat, int matSize, int* matColSize){
  int* rows = malloc(sizeof(int) * matSize);
  memset(rows, 0, sizeof(int) * matSize);
  int* cols = malloc(sizeof(int) * *matColSize);
  memset(cols, 0, sizeof(int) * *matColSize);
  for (int i = 0; i < matSize; i++) {
    for (int j = 0; j < *matColSize; j++) {
      if (mat[i][j]) rows[i]++, cols[j]++;
    }
  }
  int r = 0;
  for (int i = 0; i < matSize; i++) {
    for (int j = 0; j < *matColSize; j++) {
      if (mat[i][j] && rows[i] == 1 && cols[j] == 1) r++;
    }
  }
  return r;
}
class Solution {
public:
  int numSpecial(vector<vector<int>>& mat) {
    int m = mat.size(), n = mat[0].size(), r = 0;
    vector<int> rows(m, 0);
    vector<int> cols(n, 0);
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (mat[i][j]) rows[i]++, cols[j]++;
      }
    }
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (mat[i][j] && rows[i] == 1 && cols[j] == 1) r++;
      }
    }
    return r;
  }
};
class Solution:
  def numSpecial(self, mat: List[List[int]]) -> int:
    rows, cols, r = [0] * len(mat), [0] * len(mat[0]), 0
    for i, row in enumerate(mat):
      for j, v in enumerate(row):
        if v == 1: rows[i], cols[j] = rows[i] + 1, cols[j] + 1
    for i, row in enumerate(mat):
      for j, v in enumerate(row):
        if v == 1 and rows[i] == 1 and cols[j] == 1: r += 1
    return r
class Solution:
  def numSpecial(self, mat: List[List[int]]) -> int:# zip
    rows, cols, r = [sum(row) for row in mat], [sum(col) for col in zip(*mat)], 0
    for i, row in enumerate(mat):
      for j, v in enumerate(row):
        if v and rows[i] == 1 and cols[j] == 1: r += 1
    return r

原地修改

第 0 行存 每一行中 1 的数量

var numSpecial = function(mat) {
  const m = mat.length, n = mat[0].length
  for (let i = 0; i < m; i++) {
    let cnt1 = 0
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1) cnt1++
    }
    if (i === 0) cnt1--
    if (cnt1 === 0) continue
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1) mat[0][j] += cnt1
    }
  }
  let r = 0
  for (let j = 0; j < n; j++) if (mat[0][j] === 1) r++
  return r
};
function numSpecial(mat: number[][]): number {
  const m = mat.length, n = mat[0].length
  for (let i = 0; i < m; i++) {
    let cnt1 = 0
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1) cnt1++
    }
    if (i === 0) cnt1--
    if (cnt1 === 0) continue
    for (let j = 0; j < n; j++) {
      if (mat[i][j] === 1) mat[0][j] += cnt1
    }
  }
  let r = 0
  for (let j = 0; j < n; j++) if (mat[0][j] === 1) r++
  return r
};
class Solution {
  function numSpecial($mat) {
    foreach ($mat as $i => $row) {
      $cnt1 = 0;
      foreach ($row as $v) {
        if ($v === 1) $cnt1++;
      }
      if ($i === 0) $cnt1--;
      if ($cnt1 === 0) continue;
      foreach ($row as $j => $v) {
        if ($v === 1) $mat[0][$j] += $cnt1;
      }
    }
    $r = 0;
    foreach ($mat[0] as $v) if ($v === 1) $r++;
    return $r;
  }
}
func numSpecial(mat [][]int) int {
  for i, row := range mat {
    cnt1 := 0
    for _, v := range row {
      if v == 1 {
        cnt1++
      }
    }
    if i == 0 {
      cnt1--
    }
    if cnt1 == 0 {
      continue
    }
    for j, v := range row {
      if v == 1 {
        mat[0][j] += cnt1
      }
    }
  }
  r := 0
  for _, v := range mat[0] {
    if v == 1 {
      r++
    }
  }
  return r
}
class Solution {
  public int numSpecial(int[][] mat) {
    int m = mat.length, n = mat[0].length, r = 0;
    for (int i = 0; i < m; i++) {
      int cnt1 = 0;
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1) cnt1++;
      }
      if (i == 0) cnt1--;
      if (cnt1 == 0) continue;
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1) mat[0][j] += cnt1;
      }
    }
    for (int v : mat[0]) if (v == 1) r++;
    return r;
  }
}
public class Solution {
  public int NumSpecial(int[][] mat) {
    int m = mat.Length, n = mat[0].Length, r = 0;
    for (int i = 0; i < m; i++) {
      int cnt1 = 0;
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1) cnt1++;
      }
      if (i == 0) cnt1--;
      if (cnt1 == 0) continue;
      for (int j = 0; j < n; j++) {
        if (mat[i][j] == 1) mat[0][j] += cnt1;
      }
    }
    foreach (int v in mat[0]) if (v == 1) r++;
    return r;
  }
}
int numSpecial(int** mat, int matSize, int* matColSize){
  for (int i = 0; i < matSize; i++) {
    int cnt1 = 0;
    for (int j = 0; j < *matColSize; j++) {
      if (mat[i][j]) cnt1++;
    }
    if (i == 0) cnt1--;
    if (cnt1 == 0) continue;
    for (int j = 0; j < *matColSize; j++) {
      if (mat[i][j]) mat[0][j] += cnt1;
    }
  }
  int r = 0;
  for (int j = 0; j < *matColSize; j++) if (mat[0][j] == 1) r++;
  return r;
}
class Solution {
public:
  int numSpecial(vector<vector<int>>& mat) {
    int m = mat.size(), n = mat[0].size(), r = 0;
    for (int i = 0; i < m; i++) {
      int cnt1 = 0;
      for (int v : mat[i]) if (v) cnt1++;
      if (i == 0) cnt1--;
      if (cnt1 == 0) continue;
      for (int j = 0; j < n; j++) if (mat[i][j]) mat[0][j] += cnt1;
    }
    for (int v : mat[0]) if (v == 1) r++;
    return r;
  }
};
class Solution:
  def numSpecial(self, mat: List[List[int]]) -> int:
    for i, row in enumerate(mat):
      cnt1 = sum(v == 1 for v in row) - (i == 0)
      if cnt1 == 0: continue
      for j, v in enumerate(row):
        if v: mat[0][j] += cnt1
    return sum(v == 1 for v in mat[0])

定长列表,哈希映射两种数据结构,求解《1624. 两个相同字符之间的最长子字符串》
顺序遍历,定长列表,哈希映射两种数据结构,求解《1624. 两个相同字符之间的最长子字符串》
顺序遍历 + 二分查找算法,升序 或 降序 排序,5 解法求解《1608. 特殊数组的特征值》
顺序遍历 + 二分查找算法,升序 或 降序 排序,lower_bound / bisect_left / sort.Search 枚举 x,5 解法求解《1608. 特殊数组的特征值》
顺序遍历,栈,用 reduce / array_reduce / stream().reduce / Aggregate / accumulate 累积完成 1 行解,3 解法求解《1598. 文件夹操作日志搜集器》,
顺序遍历,栈,2 解法求解《1598. 文件夹操作日志搜集器》,用 reduce / array_reduce / stream().reduce / Aggregate / accumulate 累积完成 1 行解