編寫高效算法在 m x n 矩陣中搜索目標值。矩陣特性:
示例矩陣:
[
[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]
]
public boolean searchMatrix(int[][] matrix, int target) {
List list = new ArrayList<>();
for (int[] row : matrix)
for (int val : row)
list.add(val);
return list.contains(target);
}
缺點:額外空間、未利用矩陣有序特性、時間複雜度高。
核心思想:從右上角 (或左下角) 開始,利用行列單調性「排除」區域:
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
int rows = matrix.length, cols = matrix[0].length;
int r = 0, c = cols - 1; // 從右上角開始
while (r < rows && c >= 0) {
int cur = matrix[r][c];
if (cur == target) return true;
else if (cur > target) c--; // 太大,往左
else r++; // 太小,往下
}
return false;
}
| 解法 | 時間複雜度 | 空間複雜度 | 備註 |
|---|---|---|---|
| 暴力 + List | O(mn) | O(mn) | 不推薦 |
| 暴力雙循環 | O(mn) | O(1) | 未利用有序性 |
| 二分查找每行 | O(m log n) | O(1) | 次優 |
| Z 字形查找 | O(m+n) | O(1) | 最優 |
矩陣的「行遞增、列遞增」特性構成了部分有序結構,右上角(或左下角)是唯一能同時決定「往左走更小、往下走更大」的決策點,這是解題的幾何直覺核心。