LeetCode 5071. 找出全部行中最小公共元素(Java)


題目:5071. 找出全部行中最小公共元素html

給你一個矩陣 mat,其中每一行的元素都已經按 遞增 順序排好了。請你幫忙找出在全部這些行中 最小的公共元素java

若是矩陣中沒有這樣的公共元素,就請返回 -1web

示例:

輸入: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

時間複雜度: 雙層循環 O ( n 2 ) O(n^{2})
空間複雜度: 一維數組和 mat 的行數有關, O ( n ) O(n) htm

Java
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;// 沒找到
	}
}
相關文章
相關標籤/搜索