题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
解题思路
二分算法相关使用,请先跳转到 https://blog.csdn.net/YangLei253/article/details/96917904 学习区间划分图。
根据区间划分图解得此题。
典型的二分算法的应用。
本题目需要转一个弯,就是将二维有序数组转换成一维有序数组,而这一点是比较简单的。
应用
- 确定二分的边界
根据题目容易得到,因此int l = 0,r = matrix.size() * matrix[0].size() - 1;
。 - 得到区间划分图
采取性质nums[i] <= target
很容易得到下面的区间划分图。因此易知采用第二个模板.
- 书写代码
bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty() || matrix[0].empty()) // 如果二维数组为空,则直接返回 false { return false; } int m = matrix.size(),n = matrix[0].size(); int l = 0,r = m * n - 1; while(l < r) { int mid = (l + (long long)r + 1) >> 1; if(matrix[mid / n][mid % n] <= target) { l = mid; } else { r = mid - 1; } } if(matrix[l / n][l % n] == target) { return true; } else { return false; } }