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 }

     

     

  • 相关阅读:
    exit() _exit() 函数区别
    Linux-进程间通信(五): 网络套接字
    Linux-进程间通信(六): 记录锁
    Linux-进程间通信(N): 各种IPC的使用场景
    SQL EXISTS
    日志格式化
    logminer实战之生产环境写入数据字典,dg环境查询拷贝日志,测试环境进行挖掘,输出结果
    awr脚本使用dump导出导入
    logminer使用测试库进行挖掘分析,10.2.0.5
    10.2.0.5环境dg测试logminer挖掘日志分析
  • 原文地址:https://www.cnblogs.com/MrListening/p/5424812.html
Copyright © 2011-2022 走看看