C++实现LeetCode(74.搜索一个二维矩阵)
[LeetCode] 74. Search a 2D Matrix 搜索一个二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
文章图片
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3Example 2:
Output: true
文章图片
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13Constraints:
Output: false
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 100
- -104 <= matrix[i][j], target <= 104
解法一:
class Solution {public:bool searchMatrix(vector>& matrix, int target) {if (matrix.empty() || matrix[0].empty()) return false; int left = 0, right = matrix.size(); while (left < right) {int mid = (left + right) / 2; if (matrix[mid][0] == target) return true; if (matrix[mid][0] < target) left = mid + 1; else right = mid; }int tmp = (right > 0) ? (right - 1) : right; left = 0; right = matrix[tmp].size(); while (left < right) {int mid = (left + right) / 2; if (matrix[tmp][mid] == target) return true; if (matrix[tmp][mid] < target) left = mid + 1; else right = mid; }return false; }};
当然这道题也可以使用一次二分查找法,如果我们按S型遍历该二维数组,可以得到一个有序的一维数组,只需要用一次二分查找法,而关键就在于坐标的转换,如何把二维坐标和一维坐标转换是关键点,把一个长度为n的一维数组转化为 m*n 的二维数组 (m*n = n)后,那么原一维数组中下标为i的元素将出现在二维数组中的 [i/n][i%n] 的位置,有了这一点,代码很好写出来了:
解法二:
class Solution {public:bool searchMatrix(vector>& matrix, int target) {if (matrix.empty() || matrix[0].empty()) return false; int m = matrix.size(), n = matrix[0].size(); int left = 0, right = m * n; while (left < right) {int mid = (left + right) / 2; if (matrix[mid / n][mid % n] == target) return true; if (matrix[mid / n][mid % n] < target) left = mid + 1; else right = mid; }return false; }};
这道题其实也可以不用二分搜索法,直接使用双指针也是可以的,i指向0,j指向列数,这样第一个被验证的数就是二维数组右上角的数字,假如这个数字等于 target,直接返回 true;若大于 target,说明要减小数字,则列数j自减1;若小于 target,说明要增加数字,行数i自增1。若 while 循环退出了还是没找到 target,直接返回 false 即可,参见代码如下:
解法三:
class Solution {public:bool searchMatrix(vector>& matrix, int target) {if (matrix.empty() || matrix[0].empty()) return false; int i = 0, j = (int)matrix[0].size() - 1; while (i < matrix.size() && j >= 0) {if (matrix[i][j] == target) return true; else if (matrix[i][j] > target) --j; else ++i; }return false; }};
【C++实现LeetCode(74.搜索一个二维矩阵)】到此这篇关于C++实现LeetCode(74.搜索一个二维矩阵)的文章就介绍到这了,更多相关C++实现搜索一个二维矩阵内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- java中如何实现重建二叉树
- leetcode|leetcode 92. 反转链表 II
- 人脸识别|【人脸识别系列】| 实现自动化妆