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;
}

输出结果:


目录
相关文章
|
1月前
|
机器学习/深度学习 算法
leetcode51N皇后刷题打卡
leetcode51N皇后刷题打卡
32 0
|
1月前
|
算法
剑指offer题目汇总(一)
剑指offer题目汇总(一)
剑指offer题目汇总(三)
剑指offer题目汇总(三)
|
1月前
剑指Offer(第二版)11
剑指Offer(第二版)11
14 0
|
1月前
剑指Offer(第二版)03
剑指Offer(第二版)03
14 0
|
1月前
剑指Offer(第二版)10-2
剑指Offer(第二版)10-2
16 0
【剑指offer】-变态跳台阶-09/67
【剑指offer】-变态跳台阶-09/67
剑指offer题目汇总(二)
剑指offer题目汇总(二)
剑指offer题目汇总(四)
剑指offer题目汇总(四)
剑指offer题目汇总(五)
剑指offer题目汇总(五)