【C语言】杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);

杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。时间复杂度小于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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值