在一个 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,返回 false。
0 <= n <= 1000
0 <= m <= 1000
做这个题的方法有很多(注意:这不是矩阵,是一个nm的二维数组)
1.最容易想到的,直接暴力,时间复杂度O(nm),挺高的
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;
}
}