在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:
矩阵的长宽满足 0≤n,m≤5000 \le n,m \le 5000≤n,m≤500
矩阵中的值满足 0≤val≤1090 \le val \le 10^90≤val≤109
进阶:空间复杂度 O(1)时间复杂度 O(n+m)
示例1
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true
示例2
输入:1,[[2]]
返回值:false
bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
int i = 0;
int j = *arrayColLen - 1;
while (i < arrayRowLen && j >= 0) {
if (target == array[i][j])
return true;
if (target < array[i][j])
j--;
else
i++;
}
return false;
}
题目需要求的是二维数组中的某一个数值,我们也可以用双重for循环去写,但是时间复杂度就为O(),不符合进阶的O(n+m)
因此我们要用另一种方案~~~
规律题!!!
首先从题目中发现,我们可以发现输入我们的数组是具有一定的规律的。
如果单从递增的角度来看的话,就是这个情况。
所以假设从左边到右为 i
从上到下为 j
如果我们定义查询的点为右上角或者左下角的话,我们可以发现,往左边是递减,往下面是递增。这样我们在判断大小的时候就可以省了很多步骤了。
判断给定的值是 与 定点位的值的大小,决定往哪边走。
下面给出牛客网题目的链接:二维数组中的查找_牛客题霸_牛客网
.......~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.......
这篇文章是用自己理解的想法,又重新写了一遍的,算不上原创,只能说是笨蛋的我用脑子转载了一篇文章。