Java C++ 算法題解leetcode1582二進制矩陣特殊位置
題目要求
思路:模擬
- 直接按題意模擬,先算出每行每列中“111”的個數,然後判斷統計行列值均為111的位置即可。
Java
class Solution { public int numSpecial(int[][] mat) { int n = mat.length, m = mat[0].length; int res = 0; int[] row = new int[n], col = new int[m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { row[i] += mat[i][j]; col[j] += mat[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mat[i][j] == 1 && row[i] == 1 && col[j] == 1) res++; } } return res; } }
- 時間復雜度:O(m×n)
- 空間復雜度:O(m+n)
C++
class Solution { public: int numSpecial(vector<vector<int>>& mat) { int n = mat.size(), m = mat[0].size(); int res = 0; vector<int> row(n), col(m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { row[i] += mat[i][j]; col[j] += mat[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mat[i][j] == 1 && row[i] == 1 && col[j] == 1) res++; } } return res; } };
- 時間復雜度:O(m×n)
- 空間復雜度:O(m+n)
Rust
- 這裡的迭代函數用得不是很熟練,參考瞭好多才勉強理解下來。
impl Solution { pub fn num_special(mat: Vec<Vec<i32>>) -> i32 { let row = mat.iter().map(|row| row.iter().sum::<i32>()).collect::<Vec<_>>(); let col = (0..mat[0].len()).map(|i| mat.iter().map(|col| col[i]).sum::<i32>()).collect::<Vec<_>>(); (0..mat.len()).fold(0, |res, i| res + (0..mat[i].len()).filter(|&j| mat[i][j] == 1 && row[i] == 1 &&col[j] == 1).count() as i32) } }
- 時間復雜度:O(m×n)
- 空間復雜度:O(m+n)
以上就是Java C++ 算法題解leetcode1582二進制矩陣特殊位置的詳細內容,更多關於Java C++ 二進制矩陣特殊位置的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Java C++ 算法題解leetcode145商品折扣後最終價格單調棧
- Java C++算法題解leetcode801使序列遞增的最小交換次數
- Java C++ 算法leetcode828統計子串中唯一字符乘法原理
- Java C++題解leetcode915分割數組示例
- C++實現LeetCode(209.最短子數組之和)