Search a 2D Matrix
来源:互联网 发布:接亲堵门游戏 知乎 编辑:程序博客网 时间:2024/05/22 06:11
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.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50]]
Given target = 3
, return true
.
题目解析:
在一个整数组成的m*n的矩阵中,每行递增,并且下一行的第一个元素大于上一行最后一个元素。在这个矩阵中判断是否存在某元素target.
方法一
因为每行是递增的,我们找到target可能在的那一行,然后按照二分查找找此元素是否存在在此行就行。代码如下:
class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { bool flag=false; if(matrix.size()==0) return flag; int m=matrix.size(); int n=matrix[0].size(); int row=0; for(int i=0;i<m;i++) { if(target<matrix[i][0]) { if(i==0) return flag; else row=i-1; break; } else if(target==matrix[i][0]||target==matrix[i][n-1]) { return true; } else if(target>matrix[i][0]&&target<matrix[i][n-1]) { row=i; break; } } if(target>matrix[row][n-1]) return flag; else if(target==matrix[row][n-1]) { return true; } int low=0,high=n-1; while(low<=high) { int mid=(low+high)/2; if(target<matrix[row][mid]) high=mid-1; else if(target>matrix[row][mid]) low=mid+1; else { flag=1; break; } } return flag; }};
方法二
因为每行是递增的,每行的最后一个元素小于下一行的第一个元素,从这点可以看出,每一列也是递增的,我们可以不从每一行开始,我们从最后一列开始缩小范围,以上面矩阵为例,我们发现7>3,则3不会出现在7的下面,也不会出现在7的左下方,只会出现在7的左边,此时我们只要找7的这一行就行。如果找11呢,11大于7,将7所在行排除,只会在下面行出现,20>11,则此时在20的左边找,排除了20的下面,以及20的左下方数字。代码如下:
class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { bool flag=false; if(matrix.size()==0) return flag; int m=matrix.size(); int n=matrix[0].size(); if(m>0&&n>0) { int row=0; int col=n-1; while(row<m&&col>=0) { if(matrix[row][col]==target) { flag=1; break; } else if(matrix[row][col]>target) col--; else row++; } } return flag; }};
0 0
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D matrix
- Search a 2D matrix
- 《iOS8 Swift编程指南》样书图片
- 函数模板
- window.location 对象
- Linux 串口编程
- Adobe Flash Player ActiveX 不能安装
- Search a 2D Matrix
- opencl入门介绍
- 1402 最大值
- 代码雨
- struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD
- 程序员你造吗?2016年加州将建造子弹头火车,你还在CODE?
- Android-Universal-Image-Loader 图片异步加载类库的使用
- Ubuntu终端安装JDK
- Mysql存储过程