題目:5071. 找出全部行中最小公共元素html
給你一個矩陣 mat
,其中每一行的元素都已經按 遞增 順序排好了。請你幫忙找出在全部這些行中 最小的公共元素。java
若是矩陣中沒有這樣的公共元素,就請返回 -1
。web
輸入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]]
輸出:5數組
1 <= mat.length, mat[i].length <= 500
1 <= mat[i][j] <= 10^4
mat[i]
已按遞增順序排列。感受這題比第二題簡單多了。不明白爲何要分數同樣。app
定義一個一維數組表示每行多是最小公共元素的列下標。而後比較每行的列下標所指的數的是否相等,若是全都相等,說明它就是最小公共元素。svg
那下標的改變是靠什麼呢?spa
pos[j]
表示第 j
行的當前下標。code
若是指向的數比第 0
行的當前數小,那麼它就要加 1
,即向後移動。
若是大於,那麼說明第 j
行不存在和第 0
行第 i
個數相等的數。即第 i
個數不是最小公共元素。
若是相等就檢查下一行。直到全部行都知足條件。xml
時間複雜度: 雙層循環
空間複雜度: 一維數組和 mat
的行數有關,
htm
class Solution { public int smallestCommonElement(int[][] mat) { int m = mat.length; int n = mat[0].length; int[] pos = new int[m];// 保存每行的可能的最小公共元素的列下標 // 遍歷第0行的n個數 for (int i = 0; i < n; ++i) { boolean flag = true;// 第0行的第i個數(簡:數x)是最小的公共元素 // 遍歷第1~n行,檢查第0行的第i個數是否在第j行中 for (int j = 1; j < m; ++j) { // 第j行的數小,那麼下標pos[j]後移 while (mat[j][pos[j]] < mat[0][i]) { if (++pos[j] >= n) {// 第j行已經遍歷完,都不存在數x return -1;// 直接返回未找到,即-1 } } // 第j行的第pos[j]個數大於數x,那麼數x不知足條件 if (mat[j][pos[j]] > mat[0][i]) { flag = false;// 設爲不是 break;// 退出 } } if (flag == true) { return mat[0][i];// 是最小公共元素,返回它 } } return -1;// 沒找到 } }