杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);
1 2 3
4 5 6
7 8 9
**解题思路:**因为要求时间复杂度是O(N),所以不能用普通的遍历二维数组的方法查找一个数,因为它的时间复杂度为O(N^2);
所以应该根据杨氏矩阵的规律求解,我们首先从数组的右上角开始查找 ,对最右上角的值进行判断(num变量代表要找的数):
(1)num 等于 最右上角的值 表示找到了
(2)num 小于 最右上角的值 表示 最右边一列所有数都不等于 num,应该行数不变列数减一 继续判断
(3)num 大于 最右上角的值 表示 第0行的所有数都不等于 num,应该列数不变行数加一继续判断
一直判断知道找到或者没找到 (行数列数越界)为止。
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.
//在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);
#define MAX_COL 3 //矩阵的最大列
#define MAX_ROW 3 //矩阵的最大行
int main(){
//首先创建一个二维数组代表杨式矩阵
int arr[MAX_ROW][MAX_COL]={
{1,2,3},
{4,5,6},
{7,8,9},
};
//创建变量num为要找的数
int num;
printf("请输入要创建的数\n");
scanf("%d",&num);
//创建变量ture初值为0 表示是否找到num
int ture = 0;
//用一个while循环寻找num
//创建两个变量i,j代表二维数组的下标
int i = 0;
int j = MAX_COL -1;
//i,j的初值表示从矩阵第一行最后一列的元素开始寻找
while(1){
if(num == arr[i][j]){//如果如果num == tem代表找到 那么应该:
ture = 1;
break;//跳出循环
}else if(num > arr[i][j]){//num > arr[i][j]说明 第i行的所有元素都不可能是num 那么应该
i = i+1;//进入下一行寻找
if(i == MAX_ROW){
break;//表示没有找到 跳出循环
}
}else if(num < arr[i][j]){//num < arr[i][j]说明第j列的所有元素都不可能是num,那么应该:
j = j - 1;//进入上一列(相比于现在左边的一列)寻找
if(j == -1){
break;//表示没有找到 跳出循环
}
}
}
//循环结束后根据ture的值 输出是否找到
if(ture == 1){
printf("%d在矩阵中",num);
}else{
printf("%d不在矩阵中",num);
}
system("pause");
return 0;
}