C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

简介: 题目:有一个数字矩阵(二维数组),矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在,要求:时间复杂度小于O(N)。

题目:

有一个数字矩阵二维数组),

矩阵的每行从左到右是递增的
矩阵从上到下是递增的
请编写程序在这样的矩阵中查找某个数字是否存在,

要求:时间复杂度小于O(N)

思路:

总体思路:

(1).

自定义函数:

实现逻辑

因为是杨氏矩阵,所以一行中最右边的数是最大的

这个最大值如果比要找的值都小的话,那就可以排除这一行

列也是同理          

                 

函数参数接收 二维数组名要查找的数

存放矩阵行数的变量的指针(地址)存放矩阵列数的变量的指针(地址)

                 

通过两个变量找出二维数组第一行的最大值

使用 while循环 ,如果未查找到 二维数组的最大行数且 列数未到最小列

行的最右边的数是最大的列逐渐判断直到最小列

继续查找

(2).

while循环中

               

使用 if条件判断语句判断第一行最大值是否小于要找的值                        

        如果小于那么这一行不可能有要查找的值,可以排除这一行指针移到下一行

         

如果最大值大于要查找的值,那么该值就在这一行,逐渐移动列数在改行进行查找

如果要查找的值直接就和该行最大值相等通过调整行数和列数找到了

         

通过 矩阵的行数列数变量的指针 设置找到的行数和列数

         跳出循环还未找到的话,则将k的“坐标”设置为(-1,-1)表未找到

                     

(3).

主函数:      

出一个杨氏矩阵二维数组),

           

输入要在矩阵中找的数

             

设置矩阵的 行 和 列

使用自定义函数进行查找

函数参数二维数组名要查找的数

矩阵行数变量的指针(地址)矩阵列数变量的指针(地址)

                     

通过函数的查找情况打印相应情况


第一步:

自定义函数:

         

实现逻辑

因为是杨氏矩阵,所以一行中最右边的数是最大的

这个最大值如果比要找的值都小的话,那就可以排除这一行

列也是同理          

                 

函数参数接收 二维数组名要查找的数

存放矩阵行数的变量的指针(地址)存放矩阵列数的变量的指针(地址)

                 

通过两个变量找出二维数组第一行的最大值

             

使用 while循环 ,如果未查找到 二维数组的最大行数且 列数未到最小列

行的最右边的数是最大的列逐渐判断直到最小列

继续查找

实现代码:

#include <stdio.h>
//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
  //通过两个变量找出二维数组第一行的最大值:
  //行和列是从0开始的,
  int x = 0; //二维数组的行,从第一行进行查找
  int y = *py - 1; //二维数组的列,从最大列开始查找,
  //使用 while循环 进行查找:
  while (x<=*px-1 && y>=0)
    //x<=*px-1  -- 未查找到最大行数
    //y>=0  --  未调整到最小列数
  {
  }
}
int main() 
{
  return 0;
}

实现图片:

image.png

第二步:

在while循环中:

               

使用 if条件判断语句判断第一行最大值是否小于要找的值

         

如果小于那么这一行不可能有要查找的值,可以排除这一行指针移到下一行

果最大值大于要查找的值,那么该值就在这一行,逐渐移动列数在改行进行查找

         

如果要查找的值直接就和该行最大值相等通过调整行数和列数找到了

         

通过 矩阵的行数列数变量的指针 设置找到的行数和列数

               

跳出循环还未找到的话,则将k的“坐标”设置为(-1,-1)表未找到

                   

实现代码:

#include <stdio.h>
//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
  //通过两个变量找出二维数组第一行的最大值:
  //行和列是从0开始的,
  int x = 0; //二维数组的行,从第一行进行查找
  int y = *py - 1; //二维数组的列,从最大列开始查找,
  //使用 while循环 进行查找:
  while (x<=*px-1 && y>=0)
    //x<=*px-1  -- 未查找到最大行数
    //y>=0  --  未调整到最小列数
  {
    if (arr[x][y] < k)
      //第一行最大值 小于 k
    {
      x++; //排除这一行,移到下一行
    }
    else if (arr[x][y] > k)
      //第一行最大值 大于 k
    {
      y--; //k就在这一行,移到列进行查找
    }
    else
      //找到了:把k的行和列赋给指针px和py
    {
      *px = x;
      *py = y;
      return;
    }
  }
  //自定义未找到的情况:
  *px = -1;
  *py = -1;
}
int main() 
{
  return 0;
}  

实现图片:

image.png

第三步:

主函数:

         

给出一个杨氏矩阵二维数组),

           

输入要在矩阵中找的数

设置矩阵的 行 和 列

           

使用自定义函数进行查找

函数参数二维数组名要查找的数

矩阵行数变量的指针(地址)矩阵列数变量的指针(地址)

通过函数的查找情况打印相应情况

                   

实现代码:

#include <stdio.h>
//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
  //通过两个变量找出二维数组第一行的最大值:
  //行和列是从0开始的,
  int x = 0; //二维数组的行,从第一行进行查找
  int y = *py - 1; //二维数组的列,从最大列开始查找,
  //使用 while循环 进行查找:
  while (x<=*px-1 && y>=0)
    //x<=*px-1  -- 未查找到最大行数
    //y>=0  --  未调整到最小列数
  {
    if (arr[x][y] < k)
      //第一行最大值 小于 k
    {
      x++; //排除这一行,移到下一行
    }
    else if (arr[x][y] > k)
      //第一行最大值 大于 k
    {
      y--; //k就在这一行,移到列进行查找
    }
    else
      //找到了:把k的行和列赋给指针px和py
    {
      *px = x;
      *py = y;
      return;
    }
  }
  //自定义未找到的情况:
  *px = -1;
  *py = -1;
}
int main() 
{
  //给出一个杨氏矩阵:
  int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
  //          1 2 3
  //          4 5 6
  //          7 8 9
  //输入要找的数:
  int k = 0;
  scanf("%d", &k);
  //设置矩阵的行和列:
  int x = 3; //矩阵的行
  int y = 3; //矩阵的列
  //使用自定义函数进行查找:
  young_table_search(arr, k, &x ,&y);
  //根据情况大于相应情况:
  if (x==-1 && y==-1)
    //未找到
  {
    printf("未找到");
  }
  else
    //找到了
  {
    printf("找到了,它的下标为:第%d行 第%d列", x, y);
  }
  return 0;
}

实现图片:

image.png

最终代码和实现效果

最终代码:

#include <stdio.h>
//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
  //通过两个变量找出二维数组第一行的最大值:
  //行和列是从0开始的,
  int x = 0; //二维数组的行,从第一行进行查找
  int y = *py - 1; //二维数组的列,从最大列开始查找,
  //使用 while循环 进行查找:
  while (x<=*px-1 && y>=0)
    //x<=*px-1  -- 未查找到最大行数
    //y>=0  --  未调整到最小列数
  {
    if (arr[x][y] < k)
      //第一行最大值 小于 k
    {
      x++; //排除这一行,移到下一行
    }
    else if (arr[x][y] > k)
      //第一行最大值 大于 k
    {
      y--; //k就在这一行,移到列进行查找
    }
    else
      //找到了:把k的行和列赋给指针px和py
    {
      *px = x;
      *py = y;
      return;
    }
  }
  //自定义未找到的情况:
  *px = -1;
  *py = -1;
}
int main() 
{
  //给出一个杨氏矩阵:
  int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
  //          1 2 3
  //          4 5 6
  //          7 8 9
  //输入要找的数:
  int k = 0;
  scanf("%d", &k);
  //设置矩阵的行和列:
  int x = 3; //矩阵的行
  int y = 3; //矩阵的列
  //使用自定义函数进行查找:
  young_table_search(arr, k, &x ,&y);
  //根据情况大于相应情况:
  if (x==-1 && y==-1)
    //未找到
  {
    printf("未找到");
  }
  else
    //找到了
  {
    printf("找到了,它的下标为:第%d行 第%d列", x, y);
  }
  return 0;
}

实现效果

56871e2b3c14448890b75b1f74d31e0c.png

相关文章
|
7月前
|
算法 C语言
C语言:杨氏矩阵、杨氏三角、单身狗1与单身狗2
C语言:杨氏矩阵、杨氏三角、单身狗1与单身狗2
57 0
|
算法 测试技术 C语言
【C语言数据结构(基础篇)】第一站:时间复杂度与空间复杂度
【C语言数据结构(基础篇)】第一站:时间复杂度与空间复杂度
109 0
|
机器学习/深度学习 算法
数据结构与算法之时间复杂度和空间复杂度(C语言版)
数据结构与算法之时间复杂度和空间复杂度(C语言版)
数据结构与算法之时间复杂度和空间复杂度(C语言版)
|
7月前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(上)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
47 0
|
6月前
|
算法 C语言
C语言——oj刷题——杨氏矩阵
C语言——oj刷题——杨氏矩阵
46 0
|
7月前
|
算法 C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(下)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
32 0
|
7月前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(中)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
38 0
|
7月前
|
机器学习/深度学习 存储 算法
初阶数据结构之---导论,算法时间复杂度和空间复杂度(C语言)
初阶数据结构之---导论,算法时间复杂度和空间复杂度(C语言)
|
C语言
C语言之每日一题——杨氏矩阵
C语言之每日一题——杨氏矩阵
|
7月前
|
C语言
C语言--杨氏矩阵
C语言--杨氏矩阵
31 0