題目如下:
給你一個矩陣
mat
,其中每一行的元素都已經按 遞增 順序排好了。請你幫忙找出在所有這些行中 最小的公共元素。如果矩陣中沒有這樣的公共元素,就請返回
-1
。示例:
輸入: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]
已按遞增順序排列。
解題思路:我最初的想法遍歷整個矩陣,記錄每一個值出現的個數,如果某個值出現的次數恰好等於矩陣的行數,說明這個值是一個公共的值。但是考慮到可能一行內有重復值的情況,改成用二進制的方式記錄每個值出現在的行數,這樣就可以避免重復計算。
代碼如下:
class Solution(object): def smallestCommonElement(self, mat): """ :type mat: List[List[int]] :rtype: int """ val = [0] * (10**4+1) for i in range(len(mat)): for j in range(len(mat[i])): val[mat[i][j]] |= 2**i for i in range(len(val)): if val[i] == 2**len(mat) - 1: return i return -1