题目
杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
示例数组:
1 2 3
2 3 4
3 4 5
思路
创建 3*3为例 只能从右上方 或者左下方进行查找 即 0 2或者2 0
目的 每次查找时方向为一
方法 0 2 为例 行++或者列-- 直到查找结束 找到返回一个数没找到返回一个数
使用这种方法进行查找显而易见我们不用遍历完整个数组,当然时间复杂度也是小于O(N);
#include<stdio.h>
#include<stdlib.h>
void toFind(int arr[][3],int row,int col,int ff,int* pr,int* pc)
{
int newRow = row-3;//我们从右上角进行查找 即0 2 位置 因此需要定义初始行与列
while (newRow<3&&col>=0)
{
if (arr[newRow][col - 1]>ff)
{
col--;
}
if (arr[newRow][col-1]<ff)
{
newRow++;
}
if (arr[newRow][col - 1] == ff)
{
pr = &newRow;
pc = &col;
printf("%d%d\n",*pr,*pc-1);
return;
}
}
printf("%d\n",0);
}
int main()
{
int arr[3][3]={ {1,2,3},{4,5,6},{7,8,9}};
int col = 3;
int row = 3;
int ff = 10;
int* pc=NULL;
int* pr=NULL;
toFind(arr, row, col, ff,pr,pc);
system("pause");
return 0;
}