二维矩阵(杨氏矩阵)查找

定义:

  从左到右,从上到下,依次增大

查找某元素

假设矩阵为

                   1     2   8   9

                   2    4    9   12

                   4    7   10  13

                   6    8    11  15

    在里面查找7,如果我们从1开始,则1的右半部分,也就是剩下矩阵的全体,都可能会存在7,这是显然不行的,我们要确定一个确切的查找规则,它沿着特定路线走,最后找到

    我们看其规律,如果说要查找的元素比当前元素大,则在其右半部与下半部   如果比当前元素小,则在其左半部与上半部。

    而如果我们从右上角开始,9开始,查找7,首先7小于9,所以要在其左半部分与上半部分查找,9的上半部分是没有的,左半部分就是第1 2 3 列,第4列排除掉(注意这个排除掉的意思,意思是说7不可能在这里了)

   我们往左走到8,7比8小,同样我们还得往左走,那就是2,

  7比2大,所以我们就找右下两部分,右半部分,第3 4 列,我们其实前面已经排除了,只剩下下边的,于是我们从2开始往下走,走到了4

  ······以此类推

   杨氏矩阵难点在于如何选择起始点,以及为什么要选择这个起始点。这一点一定要搞清楚。

  我们这里找到大于要寻找的元素,不再为向下还是向右犹豫不决了,我们只需要向下,碰到小于要寻找的元素也是如此。

  

#include <iostream>
#include <algorithm>
using namespace std;
int a[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int k=0;
bool findElem(int row,int col)
{
  while((row>=0&&row<4)&&(col>0&&col<4))
  {
    if(a[row][col]=k)
		return true;
	if(a[row][col]<k)
	{
	  row++;
	}
	else
		col--;
  }
  return false;
}
int main()
{

  if(findElem(0,3))
	  cout<<"find it"<<endl;
  else
	  cout<<"could not find it"<<endl;
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值