Search a 2D Matrix II

题目描述:

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
1.Integers in each row are sorted in ascending from left to right.
2.Integers in each column are sorted in ascending from top to bottom.

Example:
Consider the following matrix:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
Given target = 5, return true.

Given target = 20, return false.

最简单的做法:for循环遍历

bool searchMatrix(vector<vector<int> >& matrix, int target) 
{
	for(int i=0;i<matrix.size();i++)
	{
		for(int j=0;j<matrix[i].size();j++)
		{
			if(matrix[i][j]==target)
			    return true;
		}
	} 
    return false;    
}

思路:这个题关键是要看到左下角和右上角这两个点的特殊性,以左下角为例,向上走数变小,向右走数变大,如果目标数大于该点就往左搜索,如果目标数小与该点就往上搜索,直到搜索到目标数或者超出矩阵范围。

#include<cstdio>
#include<vector>
using namespace std;

bool searchMatrix(vector<vector<int> >& matrix, int target) 
{
	if(matrix.size()==0||matrix[0].size()==0)
	    return false;
	if(matrix[0][0]>target||matrix[matrix.size()-1][matrix[0].size()-1]<target) 
	    return false;
	int X = matrix.size()-1;
	int Y = 0;
	while(X>=0&&Y<matrix[0].size())
	{
	    if(matrix[X][Y]>target)
	        X--;
		else
		    if(matrix[X][Y]<target)
		        Y++;
			else
			    return true; 
	}    
	return false;
}
int main(){
    int target = 20;
	vector<vector<int> > matrix; 
	int a[5] = {1,4,7,11,15};
	vector<int> line1(a,a+5);
	int b[5] = {2,5,8,12,19};
	vector<int> line2(b,b+5);
	int c[5] = {3,6,9,16,22};
	vector<int> line3(c,c+5);
	int d[5] = {10,13,14,17,24};
	vector<int> line4(d,d+5);
	int e[5] = {18,21,23,26,30};
	vector<int> line5(e,e+5);
	matrix.push_back(line1);
	matrix.push_back(line2);
	matrix.push_back(line3);
	matrix.push_back(line4);
	matrix.push_back(line5);
	printf("%d\n",searchMatrix(matrix,target));
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值