编写一个高效的算法来判断 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
解题思路:
二分法,根据首尾元素可以确定是否需要二分计算当前数组。
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m = matrix.size(); if (m == 0) return false; int n = matrix[0].size(); if (n == 0) return false; for (int i = 1; i <= m; i++) { if (target == matrix[i - 1][0]) return true; if (target == matrix[i - 1][n - 1]) return true; if (target > matrix[i - 1][0] && target < matrix[i - 1][n - 1]) return searchMatirx(matrix[i - 1], target); } return false; } bool searchMatirx(vector<int> matrix, int target) { //target在这个数组范围内 int size = matrix.size(); if (size == 0) return false; if (size == 1) return matrix[0] == target; int left = 0, right = size - 1, mid = (left + right) / 2; while (matrix[mid] != target) { if (left == right - 1) return false; if (matrix[mid] > target) { right = mid; } else { left = mid; } mid = (left + right) / 2; } return true; } }; |