杨氏矩阵(C++实现)


一、题目叙述及思路

1. 题目叙述

杨氏矩阵:

有一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的,在这样的数组中查找一个数字是否存在。

例如存在一个二维数组,每行每列都是递增的,查找一个数字是否存在:

1 2 3
4 5 6
7 8 9

2. 解题思路

假如我们要找的目标数target为5,有两种方法:

1.直接对该二维数组进行遍历,但该种方法时间复杂度为O(N^2),在此不考虑。

2.我们可以找到行列交界处,比如[0][2],即数字3这个位置,通过观察,我们可以发现,该数字是所处行中最大的,所处列中最小的,可以用目标数target和该交界处数字进行比较,如果target大于该数,则表示target比这行最大的数还要大,所以一定不在这一行,舍弃该行;如果target小于该数,则表示target比这列最小的数还要小,所以一定不在这一列,舍弃该列。以此类推,找到返回true,找不到返回false。

在这里插入图片描述


二、代码

class Solution {
public:
	bool Find(int target, vector<vector<int>> array)
	{
		int i = 0;
		int j = array[0].size() - 1;

		while (i < array.size() && j >= 0)
		{
			if (target < array[i][j]) //array[i][j]一定是当前行最大、当前列最小的数
			{
				//target < array[i][j],排除当前列
				j--;
			}
			else if (target > array[i][j])
			{
				//target > array[i][j],排除当前行
				i++;
			}
			else
			{
				return true;
			}
		}
		return false;
	}
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值