题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

分析:

二维数组这里把它看作一个矩形结构,如图所示:

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一样,效率不高。

代码:

  1. package study;
  2. /**
  3. * 二维数组中,每行从左到右递增,每列从上到下递增,
  4. * 设计一个算法找其中的一个数
  5. * @author cnx
  6. * @CreateDate ; 2014年9月28日 上午10:14:21
  7. */
  8. public class FindInMatrix {
  9. public static void main(String[] args) {
  10. FindInMatrix f = new FindInMatrix();
  11. int a[] = f.find(f.a1, 12);
  12. if(a!=null)
  13. System.out.println("a1 find 12. row= "+a[0]+"; col="+a[1]);
  14. a = f.find(f.a2, 18);
  15. System.out.println("a2 find 18. row= "+a[0]+"; col="+a[1]);
  16. a = f.find(f.a2, 2);
  17. System.out.println("a2 find 2. row= "+a[0]+"; col="+a[1]);
  18. a = f.find(f.a2, 7);
  19. System.out.println("a2 find 7. row= "+a[0]+"; col="+a[1]);
  20. }
  21.  
  22. public int a1 [][] = null;
  23. public int a2 [][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; //查找18,2,7
  24.  
  25. public int[] find(int a[][], int des){
  26. //存行列数
  27. int result[] = {-1,-1};
  28.  
  29. if(a != null && a.length>0 && a[0].length>0){
  30. int row = 0;
  31. int col = a[0].length-1;
  32. while (row<a.length && col>=0) {
  33. // System.out.println(a.length + " ," +a[0].length);
  34. if (a[row][col] == des) {
  35. result[0] = row;
  36. result[1] = col;
  37. break;
  38. }
  39. if (a[row][col] > des) {
  40. col--;
  41. }
  42. else {
  43. row++;
  44. }
  45. }
  46. }
  47. else
  48. result = null;
  49.  
  50. return result;
  51. }
  52.  
  53. }

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数的更多相关文章

  1. 剑指offer:二维数组中的查找

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  2. 剑指 Offer 04. 二维数组中的查找 (思维)

    剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...

  3. [剑指Offer]5.二维数组中的查找

    题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...

  4. 《剑指offer》 二维数组中的查找

    本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  5. 【Java】 剑指offer(3) 二维数组中的查找

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...

  6. 《剑指Offer 1.二维数组中的查找》2019-03-25

    剑指Offer  第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数 ...

  7. Go语言实现:【剑指offer】二维数组中的查找

    该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...

  8. 【剑指offer】二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   注意点:要注意特殊 ...

  9. 剑指Offer 1. 二维数组中的查找 (数组)

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

随机推荐

  1. Unity3d 怪物死亡燃烧掉效果

    效果 BurnToFadeOut.shader代码 Shader "BurnToFadeOut" { Properties { _StartColor ("Start C ...

  2. ios Tabbar Item 的图标

    1,tabBarItem图片的推荐尺寸和最大支持尺寸 下面是标签栏(UITabBar)中tab按钮图标分别在1x.2x.3x下不会压缩变形的尺寸: @1x : 推荐 25 x 25   (最大: 48 ...

  3. Redis集群的部署

    Redis集群分为主节点Master和从节点Slave,主节点只有1个,而从节点可以有多个,这样从节点和主节点可以进行数据的传输,Redis集群的性能将比单机环境更高,接下来是配置的过程 首先配置Ma ...

  4. markdown 基本语法

    代码块: ```console.log(1);```--- 标题: # h1## h2### h3 --- 粗斜体: *斜体***粗体*****粗斜体*** --- 强调:`强调` --- 链接:[百 ...

  5. MAC OS X 常用通用快捷键

    注:由于使用的是Windows键盘,习惯了Ctrl + c/v复制粘贴,所以修改了修饰键,Command(⌘)键和Control(^)键互换,以下的Ctrl键均为Command键,对应键盘上的实际左C ...

  6. codeforces 556B. Case of Fake Numbers 解题报告

    题目链接:http://codeforces.com/problemset/problem/556/B 题目意思:给出 n 个齿轮,每个齿轮有 n 个 teeth,逆时针排列,编号为0 ~ n-1.每 ...

  7. css样式设置图片半透明度,兼容IE8,火狐

    关于背景颜色透明的兼容浏览器的问题,一直是个问题,我所写的兼容IE8,和火狐,说是兼容所有浏览器我就没有测试,有兴趣的朋友可以自己测试下吧. background-color:white;filter ...

  8. ios电话/密码/验证码/身份证的正则表达式

    // 一 .电话号码正则表达式 -(BOOL)testPhoneNumber:(NSString *)text { NSString *regex =@"(13[0-9]|0[1-9]|0[ ...

  9. [Android Pro] How to get recent tasks on Android “L”?

    reference : http://stackoverflow.com/questions/24590533/how-to-get-recent-tasks-on-android-l/2688546 ...

  10. mongodb3.2配置文件yaml格式 详解

    mongodb3.x版本后就是要yaml语法格式的配置文件,下面是yaml配置文件格式如下:官方yaml配置文件选项参考:https://docs.mongodb.org/manual/ ... #c ...