题目:杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右递增,从上到下递增。
要求:请编写程序在这样的矩阵中查找具体某个数字是否存在.(时间复杂度小于 O(N);
思路:
#include<stdio.h>
void find_k(int arr[][3], int k, int* px, int* py)
{
int x = 0;//行
int y = *py - 1;//列 第一行右上角元素坐标(x,y)
while (x < px && y >= 0)
{
//查找一次
if (arr[x][y] < k)
{
x++;//下移
}
else if (arr[x][y] > k)
{
y--;//左移
}
else
{
//找到了的情况
*px = x;
*py = y;
return;
}
}
//找不到的情况
*px = -1;
*py = -1;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;//假设查找数字7
int x = 3;//横坐标
int y = 3;//纵坐标
find_k(arr, k, &x, &y);
if (x == -1 && y == -1)
{
printf("找不到该数字\n");
}
else
{
printf("找到了该数字,下标是%d %d", x, y);
}
return 0;
}
注:这里为了追求高内聚,低耦合,函数横纵坐标参数设计为返回型参数,使得参数既可以作为输入,也可以作为输出。