杨氏矩阵

问题描述:

杨氏矩阵 
有一个二维数组. 
数组的每行从左到右是递增的,每列从上到下是递增的. 
在这样的数组中查找一个数字是否存在。 
时间复杂度小于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

问题分析:

1、题目要求时间复杂度小于O(N),所以我们就不能一个一个的对比。

2、根据数据特征,可见右上角和左下角的这两个数是最高效率的查找开始点。

3、输入数字,开始查找;

4、找到返回 1 ,没找到返回 0 。


源代码:

#include <stdio.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
int Findnum(int arr[ROW][COL], int row, int col, int key)
{
	int left = 0;
	int right = col - 1;
	while ((left >= 0) && (right < col))
	{
		//如果这个数字小于key,则向后移一位;
		if (arr[left][right] < key) {
			left++;
		}
		//如果这个数字大于key,则向前移一位;
		if (arr[left][right] > key) {
			right--;
		}
		if (arr[left][right] == key) {
			return 1;
		}
	}
	return 0;
}
int main() {
	int arr[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	printf("请输入要查找的数字:");
	int key = 0;
	scanf("%d", &key);
	int ret = Findnum(arr, ROW, COL, key);
	if (1 == ret)
	{
		printf("恭喜你,找到了!\n");
	}
	if (0 == ret)
	{
		printf("很抱歉,没找到!\n");
	}
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值