概要
題目來源鏈接:https://leetcode-cn.com/problems/cells-with-odd-values-in-a-matrix/
難度:簡單
類型:數組
題目
給你一個 n 行 m 列的矩陣,最開始的時候,每個單元格中的值都是 0。
另有一個索引數組 indices,indices[i] = [ri, ci] 中的 ri 和 ci 分別表示指定的行和列(從 0 開始編號)。
你需要將每對 [ri, ci] 指定的行和列上的所有單元格的值加 1。
請你在執行完所有 indices 指定的增量操作後,返回矩陣中 「奇數值單元格」 的數目。
示例
示例 1:
輸入:n = 2, m = 3, indices = [[0,1],[1,1]]
輸出:6
解釋:最開始的矩陣是 [[0,0,0],[0,0,0]]。
第一次增量操作後得到 [[1,2,1],[0,1,0]]。
最後的矩陣是 [[1,3,1],[1,3,1]],裏面有 6 個奇數。
示例 2:
輸入:n = 2, m = 2, indices = [[1,1],[0,0]]
輸出:0
解釋:最後的矩陣是 [[2,2],[2,2]],裏面沒有奇數。
提示:
1 <= n <= 50
1 <= m <= 50
1 <= indices.length <= 100
0 <= indices[i][0] < n
0 <= indices[i][1] < m
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/cells-with-odd-values-in-a-matrix
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
示例1的圖片
示例2的圖片:
分析
以示例爲例來分析本題,給出的n和m表示一個n行m列數據元素是0的矩陣,即[[0,0,0],[0,0,0]]。然後是indices矩陣,這是一個二維數組構成的,indices = [[0,1],[1,1]]其中indices[0][0]=0,indices[0][1]=1,indices[1][0]=1,indices[1][1]=1,表示的是indices數組中的元素值,indices[0][0]=0中等於的這個0指的是n行m列矩陣的第一行所有元素加1,即[[1,1,1][0,0,0]];indices[0][1]=1中等於的這個1指的是n行m列矩陣的第二列所有元素加1,即[[1,2,1][0,1,0]];indices[1][0]=1中等於的這個1指的是n行m列劇中的第二行所有元素加1,即[[1,2,1][1,2,1]];indices[1][1]=1中等於的這個1指的是n行m列劇中的第二列所有元素加1,即[[1,3,1][1,3,1]]。畫個圖容易理解些,文字感覺有些繞。
作者下面提供的代碼是暴力破解的思路,將按照indices矩陣對n行m列矩陣進行增量操作,對操作完成後的矩陣再遍歷每個元素是否是奇數,來計算奇數的個數。
更加好的思路請參考LeetCode上的題解,有很多人的思路都非常好。
代碼
Java代碼
/**
* 奇數值單元格的數目
*
* @param n 表示幾行
* @param m 表示幾列
* @param indices 索引數組
* @return 返回奇數值單元格的數目
*/
public int oddCells(int n, int m, int[][] indices) {
// 創建0矩陣,並賦予0值
int[][] arr = new int[n][m];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = 0;
}
}
// 根據索引矩陣添加0矩陣中指定行的值
for (int k = 0; k < indices.length; k++) {
for (int j = 0; j < arr[0].length; j++) {
arr[indices[k][0]][j] += 1;
}
}
// 根據索引矩陣添加0矩陣中指定列的值
for (int q = 0; q < indices.length; q++) {
for (int i = 0; i < arr.length; i++) {
arr[i][indices[q][1]] += 1;
}
}
// 最後在完成矩陣後遍歷查找奇數單元值的個數
return findMatrixOdd(arr);
}
/**
* 尋找矩陣中元素是奇數的元素個數
* @param matrix 矩陣
* @return 返回元素是奇數的個數
*/
public int findMatrixOdd(int[][] matrix) {
int count = 0;// 計數器,記錄元素是奇數的個數,初始值爲0
for (int i = 0; i < matrix.length; i++) {// 循環遍歷二維數組
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] % 2 != 0) {// 判斷二維數組中的每個元素是否是奇數
count++;// 如果不是奇數,則計數器加1
}
}
}
return count;// 返回計數器結果
}