OJ刷题:杨氏矩阵

简介: OJ刷题:杨氏矩阵

看见这个题目,很多人的第一反应是遍历整个数组查找数字,但是这种方法不仅效率低,而且远远不能满足题目要求。下面介绍一种高效的查找方法:

代码实现:

#include <stdio.h>
int Yang_Find_Num(int arr[][3], int r, int c,int k)
{
  int x = 0;
  int y = c - 1;
  while (x <= r - 1 && y >= 0)
  {
    if (arr[x][y] < k)
    {
      x++;
    }
    else if(arr[x][y] > k)
    { 
      y--;
    }
    else
    {
      return 1;
    }
  }
  return 0;
  
}
int main()
{
  int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
  int k = 5;
  int ret = Yang_Find_Num(arr, 3, 3,k);
  if (ret == 1)
  {
    printf("找到了\n");
  }
  else
  {
    printf("找不到\n");
  }
  return 0;
}

算法思想:

如果我们想返回查找数字的行,列下标,可以对上述代码进行改进:

#include <stdio.h>
//返回型参数
int Yang_Find_Num(int arr[][3], int*px, int* py, int k)
{
  int x = 0;
  int y = *py - 1;
  while (x <= *px - 1 && y >= 0)
  {
    if (arr[x][y] < k)
    {
      x++;
    }
    else if (arr[x][y] > k)
    {
      y--;
    }
    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 = 0;
  scanf("%d", &k);
  int r = 3;
  int c = 3;
  int ret = Yang_Find_Num(arr, &r, &c, k);//传址调用
  if (ret == 1)
  {
    printf("下标为:%d %d\n",r,c);
  }
  else
  {
    printf("找不到\n");
  }
  return 0;
}

输出结果:


目录
相关文章
|
6月前
二叉树oj题集(LeetCode)
二叉树oj题集(LeetCode)
|
5月前
|
Serverless
每日OJ刷题
每日OJ刷题
31 1
|
6月前
|
Java
刷题之Leetcode24题(超级详细)
刷题之Leetcode24题(超级详细)
28 0
|
6月前
leetcode96不同的二叉搜索树刷题打卡
leetcode96不同的二叉搜索树刷题打卡
33 1
|
6月前
|
存储 容器
leetcode349刷题打卡
leetcode349刷题打卡
37 0
|
机器学习/深度学习 C语言
OJ刷题之旅(1)
OJ刷题之旅(1)
|
安全 数据安全/隐私保护 C语言
OJ刷题之旅 (2)
OJ刷题之旅 (2)
|
机器学习/深度学习
剑指Offer--LeetCode刷题篇
剑指Offer--LeetCode刷题篇
|
Java 测试技术 C语言
leetcode刷题(4)
各位朋友们,大家好。这两天我将为大家分享我在学习栈的过程中遇到的题目,我们一起来看看。