題目連結:
題目意譯:
給定一個 m × n 矩陣,回傳真(True)如果給定的矩陣為常對角矩陣(Diagonal-Constant Matrix,又稱 Toeplitz Matrix)。反之,回傳假(False)。
一個矩陣為常對角,其滿足每條從左上到右下的對角線上之元素皆有著相同的元素。
限制:
m == matrix.length
n == matrix[i].length
1 ≦ m 、 n ≦ 20
0 ≦ matrix[i][j] ≦ 99
進階:
如果矩陣儲存於硬碟上,且記憶體限制為一次最多只能讀取矩陣的一整列到主記憶體裡呢?
如果矩陣超大,你一次只能讀取部分列到主記憶體上呢?
範例測資:
範例 1:
輸入: matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
輸出: true
解釋:
在上圖,對角線為:
[9] 、 [5, 5] 、 [1, 1, 1] 、 [2, 2, 2] 、 [3, 3] 、 [4]。
在每條對角線裡,元素都是相同的,所以答案為真。
範例 2:
輸入: matrix = [[1,2],[2,2]]
輸出: false
解釋:
對角線 [1, 2] 有著不同的元素。
解題思維:
因為對於每條對角線,每個元素都位於其他元素的左上或是右下方。因此我們實際上只需要檢查每個元素是否與其左上的元素一樣,如果都符合則代表給定的矩陣為常對角矩陣。
所以對於範例一的矩陣,我們只需要檢查紅框中的每個元素是否等於其左上元素:
而所有元素都符合,所以該矩陣是常對角矩陣。
進階一:
因為硬碟存取很慢,所以我們理應盡量減少不必要的存取。而我們可以觀察到對於每條對角線上所有元素,其列座標 - 行座標之值必為相同的。
因此,我們可以使用一個雜湊表(Hash Table)儲存每條對角線的元素(存一個就好,反正如果有存到其他不同的元素即代表該矩陣不是常對角),每次掃描就是看當前元素是否與同一條對角線上其他元素相同。
進階二:
與進階一同理即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。