题目:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的请编写程序在这样的矩阵中套找某个数字是否存在。
要求:时间复杂度小于O(N);
一、杨氏矩阵是什么?
在一个二维数组中(行和列的值都相等),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
注意:每一行从左到右递增,每一列从上往下递增。递增指的是逐渐增大,切不可片面理解为等差递增。
二、杨氏矩阵求解的思路
我们以下面这个矩阵为例,查找元素k=7;
首先我们来理解一下题目,题目说明了时间复杂度要小于O(N),所以我们就不能使用遍历法来求解。
下面来说明一下我们的解题思路:
我们通过观察这个数组,可以发现,数组的每一行的最右边的数字是最大的,每一列的最下面的元素最大。因此,我们可以通过这一发现来求解杨氏矩阵。
方法:
第一步:首先我们可以先取数组中的右上角的元素(或左下角的元素,这里用右上角的为例)
第二步:让该元素和要查找的值相比较,7大于3,所以可以删掉最上面的一行。(如果查找值k<3,则删掉最右的一列)
(k>3时) (k<3时)
第三步:依次类推,我们就可以查找数组中是否有要查找的值。
三、杨氏矩阵的代码实现
//题目11:杨氏矩阵
//矩阵的每行从左到右是递增的,矩阵从上到下是递增的请编写程序在这样的矩阵中套找某个数字是否存在。
//要求:时间复杂度小于O(N);
int test(int arr[3][3], int k, int* px, int* py)
{
int row = 0; //row表示行
int col = *py - 1; //col表示列
while (row <= *px-1 && col >= 0)
{
if (arr[row][col] < k)
row++;
else if (arr[row][col] > k)
col--;
else
{
*px = row;
*py = col;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { {1,2,3 } ,{4,5,6} ,{7,8,9} };
int k = 7;
int x = 3;
int y = 3;
int ret=test(arr, k, &x, &y); //通过传地址的值来确定下标,并将下标传回来
if (ret == 1)
{
printf("找到了\n");
printf("下标为%d %d\n", x, y);
}
else
printf("找不到\n");
return 0;
}