题目:
有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
(小于 向左)
1 2 3(大于 向下)
4 5 6
7 8 9
思路:
先从数组的第一行最后一个进行查找,如果刚好相等则返回1,如果要找的值大于这个元素,则在下一行的最后一个元素查找,如果小于则在这行的倒数的第二个元素查找,以此类推
程序:
void find(int arr[][3], int *row, int *col, int key)
{
int x = 0;
int y = *col - 1;
while (x <*row&&y>0)//判断条件
{
if (arr[x][y] == key)//找到
{
*row = x;
*col = y;
return;
}
else if (arr[x][y] < key)
{
x++;//变换行
}
else
{
y--;//变换列
}
}
*row = -1;
*col = -1;
}
int main()
{
int arr[3][3]= {1,2,3,4,5,6,7,8,9};
int x=3;
int y=3;
int *row = &x;
int *col = &y;
int key=5;
find(arr,row,col,key);
if (*row == -1 && *col == -1)
{
printf("没找到\n");
}
else
{
printf("找到了,下标为 %d,%d\n", *row, *col);
}
system("pause");
return 0;
}