剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数
题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数
分析:
二维数组这里把它看作一个矩形结构,如图所示:
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果,
以查找9为例,
从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧;
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
然后看4(1,1),4<9,
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
然后看10(2,2),10>9,这个时候可以确定在10的右上方,或者左下方,
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
然后可以考虑使用递归黄色的两个方框,设an>x时是(x,y),an-k>x时是(x0,y0),那么此次递归的起始点因该是:右上(x,y0),左下(x0,y)。
左下的方框,4(2,0),4<9;再看8(3,1),8<10,可以确定不在左下方框;
右上的方框,8(0,2),8<9;再看12(1,3),12>9,再次递归,(1,2)或(0,3)都可以找到。
看似可以解决问题,但是,这个时候的矩形必须是正方形才行。。。。。。
如上图所示,就没办法了(当然,可以通过宽高的关系,计算出选择纵向移动多少次,横向移动 多少次,可以正好走个对角,但是,太麻烦了。。。。),所以,这么想是不对滴。。。。。。
然后我们考虑可以通过比较一次后可以去掉一行或者一列,那这个方法也可以算不错的了。
以查找10为例,
1.如果从左上角开始找,1<10,发现除了一个个往后比没有什么更好的办法了 ;
2.如果从右上角(0,3)开始找,9<10,由于每行从左到右递增,所以可以把第一行(0)排除掉了;
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
然后看第二行最后一个数(1,3),12>10,由于每列从上到下递增,所以可以把最后一列(3)排除;
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
然后看(1,2),9<10,排除行1;
|
1 |
2 |
8 |
9 |
|
2 |
4 |
9 |
12 |
|
4 |
7 |
10 |
13 |
|
6 |
8 |
11 |
15 |
然后看(2,2),10==10,找到目标,返回行列号。
3.除了从右上角开始分析有较好的效果外,可以发现从左下角也可以以经过一次比较排除一行或者是一列;从右下角分析则同1一样,效率不高。
代码:
package study;
/**
* 二维数组中,每行从左到右递增,每列从上到下递增,
* 设计一个算法找其中的一个数
* @author cnx
* @CreateDate ; 2014年9月28日 上午10:14:21
*/
public class FindInMatrix {
public static void main(String[] args) {
FindInMatrix f = new FindInMatrix();
int a[] = f.find(f.a1, 12);
if(a!=null)
System.out.println("a1 find 12. row= "+a[0]+"; col="+a[1]);
a = f.find(f.a2, 18);
System.out.println("a2 find 18. row= "+a[0]+"; col="+a[1]);
a = f.find(f.a2, 2);
System.out.println("a2 find 2. row= "+a[0]+"; col="+a[1]);
a = f.find(f.a2, 7);
System.out.println("a2 find 7. row= "+a[0]+"; col="+a[1]);
} public int a1 [][] = null;
public int a2 [][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; //查找18,2,7 public int[] find(int a[][], int des){
//存行列数
int result[] = {-1,-1}; if(a != null && a.length>0 && a[0].length>0){
int row = 0;
int col = a[0].length-1;
while (row<a.length && col>=0) {
// System.out.println(a.length + " ," +a[0].length);
if (a[row][col] == des) {
result[0] = row;
result[1] = col;
break;
}
if (a[row][col] > des) {
col--;
}
else {
row++;
}
}
}
else
result = null; return result;
} }
剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数的更多相关文章
- 剑指offer:二维数组中的查找
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- 剑指 Offer 04. 二维数组中的查找 (思维)
剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...
- [剑指Offer]5.二维数组中的查找
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...
- 《剑指offer》 二维数组中的查找
本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 【Java】 剑指offer(3) 二维数组中的查找
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...
- 《剑指Offer 1.二维数组中的查找》2019-03-25
剑指Offer 第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数 ...
- Go语言实现:【剑指offer】二维数组中的查找
该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...
- 【剑指offer】二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 注意点:要注意特殊 ...
- 剑指Offer 1. 二维数组中的查找 (数组)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
随机推荐
- MDI窗体
1.设置父窗体 使用MDI窗体,需要先将父窗体的IsMdiContainer属性设置为True 2.生成用于MDI子窗体的窗体 1 frmTemp f1 = new frmTemp(); f1.Tex ...
- sed小知识总结
1)sed默认是打印出文件中的所有行的,使用 -n 选项可以只打印出 匹配 的行 2)当用到sed不同的编辑命令时,用{},且不同编辑命令之间用分号
- Qt 子窗体嵌入父窗体
1.创建个子窗体QDialog.在子窗体构造函数添加 Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { u ...
- eclipse 工作环境配置
1.更换编辑颜色, http://eclipse-color-theme.github.io/update/ 下载离线安装包,解压缩 eclipse-color-theme-update-site\u ...
- SQL Server 无法在服务器上访问指定的路径或文件解决方法
SQL Server 无法在服务器上访问指定的路径或文件解决方法 在SQL Server附加数据库或备份数据库时出现:无法在服务器上访问指定的路径或文件. 请确保您具有必需的安全权限且该路径或文件存在 ...
- Linux/Unix命令
MAC 中自定义环境变量 打开:nano .bash_profile 查看:cat text 保存退出:Ctrl+C,Y #在.bash_profile 中添加tree alias tree=&quo ...
- C Primer Plus_第一章_概览_复习题与编程练习
REVIEW 1.就编程而言,可移植性表示什么? me 一个系统上编写的程序经过很少改动或者不需改动就可以在另一个系统上运行.如果修改是必须的,则通常只改变伴随主程序的一个头文件中的几项内容即可.(P ...
- 线条围绕 div 中心转圈 效果
1. 用到知识: CSS:animate ,clipe 2.原理: 用clip 属性 将div 切边 ,会出现 切边的动态效果,然后内部的div 遮住外部的div ,流出一部分 作为边: 就是旋 ...
- 【python】入门学习(六)
type() #检查变量或值得数据类型 >>> type(5) <class 'int'> 序列:包括字符串.元组和列表.序列都可以用索引.切片.len()(计算元素个数 ...
- JDBC题库
一. 填空题 JDBC ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问.它由一组用Java语言编写的类和接口组成. JDBC API:供程序员调用的接口与类,集 ...