【算法】【线性表】【数组】搜索二维矩阵
1 题目
给你一个满足下述两条属性的 m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target
,如果 target
在矩阵中,返回 true
;否则,返回 false
。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
2 解答
先定位在第几行, 然后从该行进行二分查找:
class Solution { public boolean searchMatrix(int[][] matrix, int target) { // 根据特性,先判断target 在哪一行 int i = 0; for (; i < matrix.length; i++) { if (matrix[i][0] == target) { return true; } if (matrix[i][0] < target) { continue; } // 因为在上一行 所以 i-- if (i > 0) { i--; } break; } // 不是 break出来的,正常遍历出来的 需要-- 表示最后一行进行二分查找 if (i == matrix.length) { i--; } return twoSearch(matrix[i], 0, matrix[i].length - 1, target); } // 二分查找判断 public boolean twoSearch(int[] nums, int start, int end, int target) { if (start > end) { return false; } int middle = start + (end - start) / 2; if (nums[middle] == target) { return true; } else if (nums[middle] < target) { return twoSearch(nums, middle + 1, end, target); } else { return twoSearch(nums, start, middle - 1, target); } } }
加油。