1、//杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于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
2、程序:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void find_function(int arr[3][3], int num, int row, int col,int *px,int *py)
//用px和py来记录找到的位置,startx和starty用来记录每次查到代码减少的位置
{
//从左下角开始查找
int startx = row - 1;
int starty = 0;
while (startx>=0 && starty<col)
{
if (arr[startx][starty] == num)
{
*px = startx;
*py = starty;
return;
}
else if (arr[startx][starty] > num)
{
startx--;
}
else
{
starty++;
}
}
*px = -1;
*py = -1;
return;
}
int main()
{
int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 8 } };
printf("请输入要查找的数字:");
int num;
scanf("%d", &num);
int row = 3;
int col = 3;
int px = -1;
int py = -1;
find_function(arr, num,row,col,&px,&py);
printf("%d %d\n", px, py);
system("pause");
return 0;
}
迭代法:
int find_r(int arr[3][3], int num, int row, int col,
int *px, int *py,int curx,int cury)
{
//从左下角开始查找
while (curx >= 0 && cury<col)
{
if (arr[curx][cury] == num)
{
*px = curx;
*py = cury;
return;
}
else if (arr[curx][cury] > num)
{
//px和py已为指针,则只写px,py
return find_r(arr, num, row, col, px, py, curx - 1, cury);
}
else
{
return find_r(arr, num, row, col, px, py, curx,cury + 1);
}
}
}
int main()
{
int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 8 } };
printf("请输入要查找的数字:");
int num;
scanf("%d", &num);
int row = 3;
int col = 3;
int px = -1;
int py = -1;
int curx = row - 1;
int cury=0;
//find_function(arr, num,row,col,&px,&py);
find_r(arr, num, row, col, &px, &py, curx, cury);
printf("%d %d\n", px, py);
system("pause");
return 0;
}
3、结果: