题目描述:
有一个二维数组(杨氏矩阵),数组的每行从左到右是递增的,每列从上到下是递增的,在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);
例如:
1 2 3
2 3 4
3 4 5
主要思想:
从右上角开始查找,定义横坐标 i = 0,纵坐标 j = col - 1。
若目标查找的数字比当前数字小( k < arr[i] [j] ),则向左继续查找,即 j- -;
若 k > arr[i] [j] ,则向下继续查找,即 i++;
若k == arr[i] [j] ,则返回当前下标;
直到i<0 或 j<0则说明没找到,返回 -1,-1。
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>
int search(int arr[3][3], int row, int col, int k, int *px, int*py)
{
int i = 0;
int j = col - 1;
//在有效范围内查找
while (i < row &&j >= 0)
{
if (arr[i][j] == k)
{
*px = i;
*py = j;
return 1;
}
else if (arr[i][j] < k)
{
i++;
}
else
{
j--;
}
}
*px = -1;
*py = -1;
return 0;
}
int main()
{
int a[3][3] = { 1, 2, 3, 2, 3, 4, 3, 4, 5 };
int px;
int py;
search(a, 3, 3, 5,&px,&py);
printf("%d %d\n", px,py);
system("pause");
return 0;
}