博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杨氏矩阵的查找
阅读量:5277 次
发布时间:2019-06-14

本文共 2730 字,大约阅读时间需要 9 分钟。

  

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

 

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

 

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

 

      

 

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

 

1 #include
2 #include
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 else30 {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列\n",key,ret.row+1,ret.col+1);91 ma = change(arr, length);92 n = sort(ma, length, key);93 printf("%d按顺序排列在第%d位\n", key, n+1);94 95 system("pause");96 return 0;97 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/MrListening/p/5424812.html

你可能感兴趣的文章
FFmpeg与VS2010
查看>>
(五十四)涂鸦的实现和截图的保存
查看>>
关于微信暴力加很申请
查看>>
06享元、责任链
查看>>
range,shuffle,str_shuffle
查看>>
网站性能的专业术语
查看>>
Pro/Toolkit示例之二:同步Dll程式
查看>>
ubuntu如何部署tftp服务
查看>>
[BJOI2014]大融合
查看>>
RPC简述
查看>>
题解 洛谷P4198/BZOJ2957【楼房重建】
查看>>
Easy UI分页控件修改刷新方法后触发两次请求
查看>>
【Alpha版本】冲刺阶段——Day 8
查看>>
解决CentOS6.x或RedHat Linux 6.x版本不能通过System eth0以固定IP访问外网的问题
查看>>
(转)Expression Tree不完全入门
查看>>
Struts2的工作原理
查看>>
配置EditPlus使其可以编译运行java程序
查看>>
我眼中的Android IDE
查看>>
LeetCode 112. Path Sum
查看>>
mkpasswd
查看>>