文章目录
- 标题
- 解题思路
- 优化
标题
在一个 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
解题思路
观察矩阵特点,发现可以在第一行中找到最后一个小于等于该数的位置,在该列中查找,同理找到第一列中最后一个小于等于该数的位置,在该行查找、如果都不存在,那么在小于x,y范围内查找。
public bool FindNumberIn2DArray(int[][] matrix, int target)
{
if(matrix.GetLength(0) == 0|| target == null || matrix[0].GetLength(0) == 0)return false;
int x = 0 , y = 0;
for(int i = 0 ; i < matrix[0].GetLength(0); i++)//1维长度
{
if(matrix[0][i] <= target)
{
x = i;
}
}
for(int i = 0 ; i < matrix.GetLength(0); i++)//0维长度
{
if(matrix[i][x] == target)
return true;
}
for(int i = 0 ; i < matrix.GetLength(0); i++)//0维长度
{
if(matrix[i][0] <= target)
{
y = i;
}
}
for(int i = 0 ; i < matrix[0].GetLength(0); i++)//1维长度
{
if(matrix[y][i] == target)
return true;
}
for(int i = 0 ; i <= y; i++)//在x,y内找
{
for(int j = 0; j <= x ; j++)
{
if(matrix[i][j] == target)
return true;
}
}
return false;
}