lintcode. 28 搜索二维矩阵

这个问题主要在于算法时间

题目描述:

写出一个高效的算法来搜索 m × n矩阵中的值。

这个矩阵具有以下特性:

  • 每行中的整数从左到右是排序的。
  • 每行的第一个数大于上一行的最后一个整数。

样例

考虑下列矩阵:

[
  [1, 3, 5, 7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]

给出 target = 3,返回 true

解决思路:

直接暴力求解的话,复杂度O(m*n)。观察这个题目,题目已经说了两个特性,那么解决思路就来了

解法一:将这个矩阵展开成一维数组,使用二分法搜索

解法二:从左下角开始搜索,目标元素记为target,矩阵中搜索元素记为item,如果target < item,说明目标元素target位置在当前元素item的上方;如果target > item,说明目前元素在当前元素的右方;复杂度为O(m+n),这种方法可以搜索到整个矩阵,怎么理解呢,你在X轴方向走M步,Y轴方向走N步可以保证到达矩阵上所有点。


代码:

class Solution {
public:
	/*
	* @param matrix: matrix, a list of lists of integers
	* @param target: An integer
	* @return: a boolean, indicate whether matrix contains target
	*/
	bool searchMatrix(vector<vector<int>> &matrix, int target) {
		// write your code here
		if (!matrix.empty())
		{
			int col, row;
			col = matrix.size();
			row = matrix[0].size();

			int x, y;
			x = col - 1;			//from the lower left corner
			y = 0;

			while (true)
			{
				if (target < matrix[x][y]) --x;
				else if (target > matrix[x][y]) ++y;
				else
				{
					return true;
				}

				if (x < 0 || y >= row) break;
			}
		}

		return false;
	}
};


又涨新姿势了,手动滑稽


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值