🚩传送门:牛客题目
题目
已知一个有序矩阵
,同时给定矩阵的大小
和
以及需要查找的元素
,且矩阵的行和列都是从小到大有序的。
设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。
解题思路:贪心
该矩阵的每行、每列都是从小到大递增的. 根据这个条件, 我们可以从左下开始找, 然后这样判断:
当从左下角开始的时候我们只有两个方向,要么向上,要么向右
- 当向右的时候代表包括当前所在列的左边部分全部被舍弃
- 当向上的时候代表包括当前所在行的下边部分全部被舍弃
- 如果
当前值
大于目标值
:那么根据该矩阵的特性, 其右边的数只可能更大,我们往上走一步。 - 如果
当前值
小于目标值
:那么上边的数只可能更小,我们往右走 。
例如:我们从左下角 开始,目标值为
。
, 说明
上边的一定都比
小,所以向右走
,说明
右边的一定都比
大,所以向上走
,说明
右边的一定都比
大,所以向上走
, 说明
上边的一定都比
小,所以_向右**走
, 找到答案
复杂度分析
时间复杂度:,其中
为数组的行数,
为数组的列数。
空间复杂度:,使用常数的空间
我的代码
public int[] findElement(int[][] mat, int n, int m, int x) {
int i=n-1,j=0;
while(mat[i][j]!=x){
if(mat[i][j]<x){
j++;
}else if(mat[i][j]>x){
i--;
}else break;
}
return new int[]{i,j};
}