zoukankan      html  css  js  c++  java
  • 杨氏矩阵的查找

      

           在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。这道题是一道非常经典的题目,很多面试中都会遇到。但其实我们一拿到这个问题,可能都会想到那就直接找呗,我们把这样一个二维数组遍历一遍不是很快就找到了吗,但这并不是面试官所想看到的,下面我们来分析分析。

         首先我们随便拿一个满足条件的二维数组,假设我们要查找6是否在数组中,我们可以发现,如果第一行的最大数字都比6小,我们就直接在下一行查找,同样如果某一列的最小数都比6小,我们也就不用在比较这一列其他的数字了。

         首先选择第一行的最大数也就是最右边的5和6进行比较,发现是比6小的,那么我们就把第一行舍去转而比较第二行的最大数8,发现是大于6的,所以,这一列其他元素肯定都大于6了,应该把这一列也舍去,以此类推。

          

          下面是我的查找代码,对代码进行了很多地方的修正,如果查找到要找的数字直接返回它的下标,而且还有一个问题,就是它求出了这个二位数组所有元素按从小到大的顺序排列后,所要查找的数排在多少位。我在函数中取的二位数组比较简单{1, 2, 3, 4, 5, 6, 7, 8, 9 }

     1 #include<stdio.h>
     2 #include<windows.h>
     3 
     4 #define ROW 3
     5 #define COL 3
     6 
     7 typedef struct Ret   //定义一个结构体类型,为了返回下标
     8 {
     9     int row;
    10     int col;
    11 }Ret;
    12 
    13 Ret find_num(int arr[ROW][COL], int rows, int cols, int key)  //查找函数
    14 {
    15     int row = 0;
    16     int col = cols - 1;
    17     Ret ret = { 0, 0 };
    18 
    19     while (row <= 2 && col >= 0)
    20     {
    21         if (arr[row][col] > key)  //如果比要找的数大,则列减一
    22         {
    23             col--;
    24         }
    25         else if (arr[row][col] < key)  //如果比要找的数小,则行加一
    26         {
    27             row++;
    28         }
    29         else
    30         {
    31             ret.row = row;
    32             ret.col = col;
    33             return ret;
    34         }
    35     }
    36     ret.row = -1;   //如果没有找到,返回(-1,-1)
    37     ret.col = -1;
    38     return ret;
    39 }
    40 
    41 int* change(int arr[ROW][COL],int length )     //二位数组转换成一位数组函数,length为二位数组的大小
    42 {
    43     int i = 0;
    44     int *ma =(int *) malloc(length*sizeof(int));   //动态开辟了一个一位数组,也可以在函数外面初始化一个一位数组在这里调用
    45     int row = 0, col = 0;
    46     
    47     for (i = 0; i < length; i++)
    48     {
    49         ma[i] = arr[row][col];
    50         col++;
    51         if (col>COL - 1)
    52         {
    53             row++;
    54             col = 0;
    55         }
    56     }
    57     return ma;
    58 }
    59 int sort(int* arr,int length,int key )   //排序函数
    60 {
    61     int x = 0,y = 0;
    62     for (x = 0; x < length;x++)
    63     {
    64         for (y = x + 1; y < length; y++)
    65         {
    66             if (arr[x]>arr[y])
    67             {
    68                 int temp = arr[x];
    69                 arr[x] = arr[y];
    70                 arr[y] = temp;
    71             }
    72             if (arr[x] == key)
    73             {
    74                 return x;
    75             }
    76         }
    77     }
    78     return -1;
    79 }
    80 
    81 
    82 int main()
    83 {
    84     int arr[ROW][COL] = { 1, 2, 3, 2, 3, 4, 3, 4, 5 };
    85     int length = sizeof(arr) / sizeof arr[0][0];
    86     int key = 2;
    87     int* ma=NULL;
    88     int n = 0;
    89     Ret ret = find_num(arr,ROW, COL, key);
    90     printf("%d在第%d行第%d列
    ",key,ret.row+1,ret.col+1);
    91     ma = change(arr, length);
    92     n = sort(ma, length, key);
    93     printf("%d按顺序排列在第%d位
    ", key, n+1);
    94 
    95     system("pause");
    96     return 0;
    97 }

     

     

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/MrListening/p/5424812.html
Copyright © 2011-2022 走看看