題目連結:
題目意譯:
給定一個 m × n 矩陣 grid 其列與行都已按照非遞增順序排序,回傳 grid 中的負數之個數。
限制:
m == grid.length
n == grid[i].length
1 ≦ m 、 n ≦ 100
-100 ≦ grid[i][j] ≦ 100
進階: 你可以找到一個 O(n + m) 的解法嗎?
範例測資:
範例 1:
輸入: grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
輸出: 8
解釋: 矩陣中有 8 個負數。
範例 2:
輸入: grid = [[3,2],[1,0]]
輸出: 0
範例 3:
輸入: grid = [[1,-1],[-1,-1]]
輸出: 3
範例 4:
輸入: grid = [[-1]]
輸出: 1
解題思維:
因為矩陣已經按照非遞增的順序排序了列以及行,所以負數會集中於矩陣的右側。所以我們可以從矩陣的右上角開始,一直往左直到碰到正數或是矩陣邊緣。
然後我們便一直往下,每往下一列我們便視需要往左調整到碰到正數或是邊緣。對於每一列,因為負數集中於右側,所以我們停留在每列的位置及可以計算出該列有多少個負數。
所以例如矩陣
4 3 2 -1
3 2 1 -1
1 1 -1 -2
-1 -1 -2 -3
我們會走過如上紅色的部分。而我們可以得出從上至下每列有 1 、 1 、 2 、 4 個負數,所以總共有 8 個負數。
因此時間複雜度是 O(n + m) 。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。