剑指offer习题3——二维数组的排序和查找
来源:互联网 发布:网络北京时间 编辑:程序博客网 时间:2024/06/06 14:08
题目:在一个二维数组中,每一行都按照从左到右递增顺序排序,每一列都赞找从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
eg:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
首先我们需要对二维数组进行排序,其实二维数组的排序和一维数组的排序没有什么本质上的区别,一维数组怎么排,二维数组还是怎么排,这里我们主要研究的不是排序,所以我就用最简单的冒泡排序,二维数组无非就是多排几趟,我们分为行排序和列排序,因为它们在下标处理上有点细微的差别,但是原理不变,有多少行就调用多少次行排序,列的排序也是如此。
二维数组排序这部分代码如下:
const int row=4;
const int line=4;//一行排序
void bubblesort_line(int (*arr)[row], int eachline, int len)
{
for(int i=0;i<len-1;++i)
for(int j=0;j<len-1-i;j++)
{
if(arr[eachline][j]>arr[eachline][j+1])
{
int tmp=arr[eachline][j];
arr[eachline][j]=arr[eachline][j+1];
arr[eachline][j+1]=tmp;
}
}}
//一列排序
void bubblesort_row(int (*arr)[row], int eachrow,int len)
{
for(int i=0;i<len;++i)
for(int j=0;j<len-1-i;j++)
{
if(arr[j][eachrow]>arr[j+1][eachrow])
{
int tmp=arr[j][eachrow];
arr[j][eachrow]=arr[j+1][eachrow];
arr[j+1][eachrow]=tmp;
}
}
}
//二维数组排序
void sort(int (*arr)[row],int line,int row)
{
for(int i=0;i<line;++i)
{
bubblesort_line(arr,i,row);
}for(int i=0;i<row;++i)
{
bubblesort_row(arr,i,line);
}
}
我再把一个排序后的二维数组展示一下,方便大家对照这个观察规律:
列数 0 1 2 3
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
查找功能解决分析:
首先主题思路是需要限制查找的范围,我们仔细观察会发现,右上角的数是一列中最小的,但是确实一行中最大的,那如果我们查找的值,比这一列中的最小的数都小,那它肯定就比这一列的其他数要小,所以可以直接将列的边界减小,缩小一列的范围。同样的我们观察行,我们会发现我们每一行的列边界是一行中的最大值,例如,我们要查找7,它小于9,8,所以我们列边界在1列了。我们第一行的最大值是不是a[0][1]; 所以我们如果我们要查找值比一行中数的最大值还大,那行边界可以增加了,因为这一行前面的数字肯定比这个小。范围缩小后我们再做一一比较。
如果还是不太理解的话,我就直接上图吧,有图有真相!
我们假设我们要找7
linebound=0
rowbound=3
a[lowbound][rowbound]=9 >7
--row
linebound=0
rowbound=2
a[lowbound][rowbound]=8 >7
--row
linebound=0
rowbound=1
a[lowbound][rowbound]=2 >7
++linebound
linebound=1
rowbound=1
a[lowbound][rowbound]=4 >7
++linebound
我们就找到7了。
理清楚思路了,我们可以把解题思路转化为代码思想。我们每次比较是不是都分为3种情况:
1、a[linebound][rowbound]==val
2、a[lineboudn][rowbound]<val
3、a[linebound][rowbound]>val
我们上代码,上完我们再仔细分析一下代码的实现细节和易错易混淆的点:
{
sort(arr,*l,*r);
int linebound=0;
int rowbound=*r-1;
{
if(arr[linebound][rowbound]==val)
{
//printf("linebound:%d rowbound:%d",linebound,rowbound); 这些是辅助我们分析得输出
//printf("a[linebound][rowbound]%d ==%d\n",arr[linebound][rowbound],val);
*l=linebound;
return true;
}
else if(arr[linebound][rowbound]<val)
{
//printf("linebound:%d rowbound:%d",linebound,rowbound); 带注释的printf信息都是辅助测试分输出
//printf("a[linebound][rowbound]%d <%d\n",arr[linebound][rowbound],val);
//printf("linebound:%d rowbound:%d\n",linebound,rowbound);
}
{
printf("linebound:%d rowbound:%d",linebound,rowbound);
printf("a[linebound][rowbound]%d >%d\n",arr[linebound][rowbound],val);
--rowbound;
}
if(rowbound<0||linebound>=*l)
{
return false;
}
{
return true;
}
}
- 剑指offer习题3——二维数组的排序和查找
- 剑指offer—二维数组的查找
- 剑指offer—二维数组的查找
- 剑指offer习题---二维数组中的查找
- 剑指offer 3---二维数组的查找
- 剑指offer——二维数组查找
- 剑指Offer——二维数组查找
- 剑指offer——二维数组的查找
- 剑指offer——二维数组的查找
- 剑指offer——二维数组的查找
- 剑指offer刷题—二维数组的查找
- 剑指offer(1)—二维数组的查找
- 剑指offer面试题3—二维数组中的查找
- 【剑指offer】面试题3 数组 二维数组的查找
- 《剑指offer》数组——二维数组中查找
- 剑指offer第3题——>有序二维数组的查找
- 剑指offer——面试题3:二维数组的查找
- 剑指offer - 二维数组的查找
- Goland软件使用教程(三)
- (主席树)hdu2665 Kth number
- 软件性能测试学习笔记第一课:概念
- AutoMapper官方文档(五)【反向映射和复杂化】
- (ACM)Elevator
- 剑指offer习题3——二维数组的排序和查找
- 红茶一杯话Binder 二(ServiceManager篇)
- JAVASE之运算符和基本语句
- Android中TextView中部分文字有不同颜色的实现
- codeforces Help Kingdom of Far Far Away 2
- requests模块--python发送http请求
- js中的正则表达式
- AutoMapper官方文档(六)【投影】
- 模板