剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 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]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false0 <= n <= 1000
0 <= m <= 1000

做这个题的方法有很多(注意:这不是矩阵,是一个nm的二维数组)
1.最容易想到的,直接暴力,时间复杂度O(n
m),挺高的
2.直接遍历二维数组,再用in_array方法判断target是否在value中
3.这是我自己想到的(试了好久),我是从左上角也就是[0][0]开始找,这样找的的话两边都是升序,很麻烦,遇到的情况很多,我差不多都提交错了好多次,一步一步试出来的了
4.这是看了题解比较好的一种方法,就是从右上角开始找,这样往左是降序,往下是升序,直接控制行列很容易就找到,时间复杂度是O(n+m)
直接贴出第四种方法的代码了
执行用时:72 ms, 在所有 PHP 提交中击败了83.06%的用户
内存消耗:21.1 MB, 在所有 PHP 提交中击败了100.00%的用户

class Solution {

    /**
     * @param Integer[][] $matrix
     * @param Integer $target
     * @return Boolean
     */
    function findNumberIn2DArray($matrix, $target) {
    	$row = count($matrix);
    	$col = count($matrix[0]);
    	if (empty($matrix) || $target < $matrix[0][0] || $target > $matrix[$row-1][$col-1]) {
    		return false;
    	}
    	$r = 0;
    	$c = $col - 1;
    	while ($r < $row && $c >= 0) {
    		if ($target > $matrix[$r][$c]) {
    			$r++;
    		} elseif ($target < $matrix[$r][$c]) {
    			$c--;
    		} elseif ($target == $matrix[$r][$c]) {
    			return true;
    		}
    	}
    	return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值