杨氏矩阵

题目
有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。
时间复杂度小于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,如果要找的值大于这个元素,则在下一行的最后一个元素查找,如果小于则在这行的倒数的第二个元素查找,以此类推
程序:

void find(int arr[][3], int *row, int *col, int key)
{
 int x = 0;
 int y = *col - 1;
 while (x <*row&&y>0)//判断条件
 {
  if (arr[x][y] == key)//找到
  {
   *row = x;
   *col = y;
   return;
  }
  else if (arr[x][y] < key)
  {
   x++;//变换行
  }
  else
  {
   y--;//变换列
  }
 }
 *row = -1;
 *col = -1;
}
int main()
{
 int arr[3][3]= {1,2,3,4,5,6,7,8,9};
 int x=3;
 int y=3;
 int *row = &x;
 int *col = &y;
 int key=5;
 find(arr,row,col,key);
 if (*row == -1 && *col == -1)
 {
  printf("没找到\n");
 }
 else
 {
  printf("找到了,下标为 %d,%d\n", *row, *col);
 }
 system("pause");
 return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值