剑指offer题三:二维数组中的
来源:互联网 发布:ubuntu wine qq乱码 编辑:程序博客网 时间:2024/05/27 16:40
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入:
输入可能包含多个测试样例,对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
输出:
对应每个测试案例,输出”Yes”代表在二维数组中找到了数字t。
输出”No”代表在二维数组中没有找到数字t。
分析 :
从右上角开始比较,如果刚好相等,那么直接返回true;
如果要找的数比右上角的大,说明所在的这一行不用比较,那么行数加1 到下一行的右上角比较;
如果要找的数比右上角的小,说明所在的列不用不叫,那么列数减1,到前边伊一列的右上角比较;
因为开始是在九度OJ上做的,所以就是直接按照他的格式来的。
方法一是使用了 动态分配二维数组方式,这方式直接但是分配的数组 只有同一行的在内存中是连续的,但不能保证不同行在内存中连续,例如第二行地址不一定紧接在第一行后面
方法二是使用了 一种折中的方式,利用一维数组来存储二维数组,在函数传参上也不易出错。
当然 很多时候我们也会用数组的方式,只是会define一个MAX作为初始值,但总觉得这种太死板了
方法1:
#include <stdio.h>#include <malloc.h>#define MAX 10bool ifIncluded(int **data,int m,int n,int num) //二维数组参数{ int i=0,j=n-1,temp; while(i<m && j>=0) { temp= *(*(data+i)+j); //二维数组访问 if(num ==temp ) return true; if(num > temp) i++; else j--; } return false;}int main(void){ int m,n,num; int **data; int i,j,count=-1; bool result[MAX]={false}; while(scanf("%d%d%d",&m,&n,&num)!=EOF) { count++; data=(int**)malloc(sizeof(int*)*m); for(i=0;i<m;i++) data[i]=(int*)malloc(sizeof(int)*n); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%d",&data[i][j]); if(ifIncluded(data,n,m,num)) result[count]=true; else result[count]=false; for(i=0;i<m;i++) //自己malloc,自己free free(data[i]); free(data); } for(i=0;i<=count;i++) if(result[i]) printf("Yes\n"); else printf("No\n"); free(result); return 0;}
方法2:
#include <stdio.h>#include <malloc.h>#define MAX#define false 0 //这是因为不这么做的话 OJ会提示 false,true undeclared#define true 1int ifIncluded(int *data,int m,int n,int num) //使用一维数组存储二维数组{ int i=0,j=n-1,temp; if(!data || m <=0 || n<=0) return false; if(data[0]>num || data[m*n-1]<num) return false; if(data[0]==num || data[n*m-1]==num) return true; while(i<m && j>=0) { temp=*(data+i*n+j); //使用一维数组存储二维数组时候的数组元素访问 if(temp==num) return true; if(temp>num) j--; else i++; } return false;}int main(void){ int m,n,num; int *data; int i,j,count=-1; int result[MAX]={false}; int len=0; while(scanf("%d%d%d",&m,&n,&num)!=EOF) { printf("input matrix\n"); count++; len=m*n; data=(int*)malloc(sizeof(int)*m*n); for(i=0;i<len;i++) scanf("%d",&data[i]); if(ifIncluded(data,m,n,num)) result[count]=true; else result[count]=false; free(data); //自己malloc 自己free } for(i=0;i<=count;i++) if(result[i]) printf("Yes\n"); else printf("No\n"); free(result); return 0;}
测试用例:
1 positive: 所找元素在矩阵中,等于最小的元素,等于最大的因素,介于最大与最小中间;
2 negative:所找元素不在矩阵中,小于最小元素,大于最大的元素,介于最大与最小中间但是不存在的;
4 invalid:输入的数组为空等。
知识点:
1 对二维数组的分配方式(静态,动态)的使用,及怎么传入二维数组参数。更加详细可以参见 http://www.cnblogs.com/wuyuegb2312/archive/2013/06/14/3135277.html
2 我自己总是在scanf时候忘了 &!!! 像 &data[i][j]
0 0
- 剑指offer题三:二维数组中的
- 剑指Offer算法实现之三:二维数组中的查找
- 《剑指offer》面试题三 二维数组中的查找
- 剑指offer:面试题三:二维数组中的查找
- 剑指Offer 面试题三:二维数组中的查找
- 剑指offer(三)之二维数组中的查找
- 剑指Offer----面试题三:二维数组中的查找
- 《剑指Offer》面试题三之二维数组中的查找
- 剑指offer面试题三:二维数组中的查找
- 剑指offer 3题 【数组】二维数组中的查找
- 剑指offer第一题【二维数组中的查找】c++实现
- 剑指Offer 3题 二维数组中的查找 Java
- 剑指offer第一题:二维数组中的查找解题报告
- 二维数组中的查找 (剑指Offer 第 1 题)
- 剑指offer-->二维数组中的查找
- 剑指offer之二维数组中的查找
- 剑指offer:3-二维数组中的查找
- [剑指Offer]二维数组中的查找
- 【Web 前端】文字排版、段落排版
- Android五种数据传递方法汇总
- 什么是机器学习:一次权威定义之旅
- poj3642 Charm Bracelet(0-1背包)
- VS2010编译错: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403...的解决方法
- 剑指offer题三:二维数组中的
- Struts2与JSON
- 软件工程文档
- [Erlang危机](5.1.0)VM检测概述
- HEVC中名词的解释
- serialVersionUID的作用
- NOSQL之Redis学习札记
- Mysql索引
- #include与寻找函数的实现