難度簡單
在一個 n * m 的二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
示例:
現有矩陣 matrix 如下:
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
給定 target = 5
,返回 true
。
給定 target = 20
,返回 false
。
限制:
0 <= n <= 1000
0 <= m <= 1000
解析:
方法一:暴力
方法二:線性查找
由於數組排列是有順序的,因此通過元素的比較可以縮小target所在的範圍
從二維數組右上角元素開始查找。
如果當前元素 = target,則返回 true。
如果當前元素 > target,則列左移,-1。(因爲列元素是遞增的,所以這一列下面元素也大於target)
如果當前元素 < taret,則行下移,+1。(因爲行元素是遞增的,所以這一行左面元素也小於target)
若數組爲空,返回 false
初始化:行下標爲 0,列下標爲二維數組的列數減 1
while循環,條件是:行下標或列下標超出邊界 row
獲得當前下標位置的元素 num
如果 num 和 target 相等,返回 true
如果 num 大於 target,列 col -1
如果 num 小於 target,行 row + 1
循環體執行完畢仍未找到元素等於 target ,說明target不存在,返回 false`
複雜度分析
時間複雜度:O(n+m)。訪問到的元素下標:行最多減少 n 次,列最多增加 m 次,因此循環體最多執行 n + m 次。
空間複雜度:O(1)。
Python
class Solution(object): def findNumberIn2DArray(self, matrix, target): """ :type matrix: List[List[int]] :type target: int :rtype: bool """ if not matrix: return False max_row = len(matrix)-1 max_col = len(matrix[0])-1 row_idx, col_idx = 0, max_col while row_idx <= max_row and col_idx >= 0: num = matrix[row_idx][col_idx] if num == target: return True elif num > target: col_idx -= 1 else: row_idx += 1 return False matrix = [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] s = Solution() print(s.findNumberIn2DArray(matrix, 5)) print(s.findNumberIn2DArray(matrix, 20))
Java
class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return false; } int maxRow = matrix.length-1; int maxCol = matrix[0].length-1; int rowIdx = 0; int colIdx = maxCol; while (rowIdx <= maxRow && colIdx >= 0) { int num = matrix[rowIdx][colIdx]; if (num == target) { return true; } else if (num > target) { colIdx--; } else { rowIdx++; } } return false; }
執行用時 :0 ms, 在所有 Java 提交中擊敗了100.00%的用戶
內存消耗 :45.4 MB, 在所有 Java 提交中擊敗了100.00%的用戶