题目:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 输出: true
示例 2:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 输出: false
解题思路:
首先应该找到target所在行,通过一行的首尾元素与target的大小关系,确定其所在行数
if((matrix[i][0] <= target) && (matrix[i][n - 1] >= target))
在确定好行数后,就在一行内采用二分查找算法寻找target
class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(null == matrix || 0 == matrix.length || 0 == matrix[0].length) return false; int m = matrix.length; int n = matrix[0].length; int i; for(i = 0; i < m; i++) { if((matrix[i][0] <= target) && (matrix[i][n - 1] >= target)) break; } if(i == m) return false; if(matrix[i][0] == target || matrix[i][n - 1] == target) return true; int left = 0; int right = n -1; int mid = (left + right) / 2; while(left <= right) { if(target == matrix[i][mid]) return true; else if(target < matrix[i][mid]) { right = mid - 1; mid = (left + right) / 2; } else { left= mid + 1; mid = (left + right) / 2; } } return false; } }