C语言——杨氏矩阵

题目:编写程序,在杨氏矩阵中查找某个数字是否存在并且打印下标(时间的复杂度小于O(N)。

什么是杨氏矩阵:矩阵的每行从左到右是递增的,每列从上到下是递增的。

例如:

123
456
789

1、思路:右上角的元素特殊,它是第0行最大的数,是第2列最小的数。用要查找的数与这个特殊元素比较,每次比较都可以排除一列或者一行,用x表示行,y表示列。假设我们要找的元素是7,首先3<7,因为3是第0行中最大的元素,所以排除第0行,x++;此时右上角元素锁定为6,6<7,因为6是第1行中最大的数,所以排除第1行,x++;此时到了第2行,元素锁定为9,9>7,要找的元素就锁定第2行,y--得到8,8>7,继续y--得到7,这样就找到了我们要找的元素,如果在这一行中找不到,说明我们要找的元素在矩阵中没有。

2、因为时间复杂度小于O(N),不能去遍历数组

3、代码实现:

#include<stdio.h>
int FindNum(int arr[3][3],int k, int* px, int* py)
 {
   int x=0;     //右上角元素的下标arr[0][2]
   int y=*py-1;
   while(x<=*px-1&&y>=0)//循环条件:查找的行x<=2(x++过程中),查找的列y>=0(y--过程中),具体看 
                        //给的数组来看
     {
       if(arr[x][y]>k)
          {
            y--;
          }
          else if(arr[x][y]<k)
          {
            x++;
          }
          else
          {
            *px=x;
            *py=y;
            return 1;
          }
      }
       return 0;   
 }
int main()
{
   int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
   int k=7;      //假设要找的元素是7,根据自己要求查找
   int x=3,y=3; //具体看给的数组传相应的行和列
   int ret=FindNum(arr,k,&x,&y);//查找元素的函数,因为这个函数要带回下标,所以参数取地址传过 
                                //去,如果不传地址,形参的改变不能影响实参
   if(ret==1)
     {
       printf("找到了\n");
       printf("下标是:%d %d\n",x,y);
     }
     else
     {
       printf("找不到\n");
     }
     return 0;
 }

 4,如果你学会了,给个免费的赞在走吧

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值