用递归查找有序二维数组的方法详解

 更新时间:2013年06月04日 17:43:46   作者:  
本篇文章是对用递归查找有序二维数组的方法进行了详细的分析介绍,需要的朋友参考下
假设给定一个有序二维数组,每一行都是从左到右递增,每一列都是从上到下递增,如何完成一个函数,输入这样一个二维数组和一个整数,判断这个整数是否在这个二维数组中。
假设一个4×4的有序二维数组:
          1          2          8          9
          2          4          9          12
          4          7          10        13
          6          8          11        15
要查找的数字为6。
算法的核心思想是,先取最左上角的数字9,因为9比6大,所以可以排除比9大的数字,也就是第四列,然后取8,同理排除第三列,再取2,比6小,可排除比2小的数字,也就是第一行,同理取4,排除第二行,取7,排除第二列,取4,排除第三行,取6,相等,返回true。
这里我们用递归实现,代码为:
复制代码 代码如下:

public class FindMatrixNumber {
 private static FindMatrixNumber instance;
 private static boolean found = false;
 public static FindMatrixNumber getInstance() {
  if (instance == null) {
   instance = new FindMatrixNumber();
  }
  return instance;
 }
 public static boolean find(int matrix[][], int number) {
  if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
   return false;
  } else {
   System.out.println("****Start finding****");
   findMatrixNumber(matrix, matrix.length, 0, matrix[0].length,
     number);
   System.out.println("*****End finding*****");
  }
  return found;
 }
 private static void findMatrixNumber(int matrix[][], int rows, int row,
   int columns, int number) {
  if (row > rows - 1)
   return;
  int cornerNumber = matrix[row][columns - 1];
  System.out.println(cornerNumber);
  if (cornerNumber == number) {
   found = true;
   return;
  } else if (cornerNumber < number) {
   findMatrixNumber(matrix, rows, ++row, columns, number);
  } else if (cornerNumber > number) {
   findMatrixNumber(matrix, rows, row, --columns, number);
  }
 }
}

测试代码为:
复制代码 代码如下:

public class TestFindMatrixNumber {

 public static void main(String[] args) {
  int matrix[][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
  System.out.println(FindMatrixNumber.find(matrix, 6));
 }

}

测试代码运行结果为:
复制代码 代码如下:

****Start finding****
9
8
2
4
7
4
6
*****End finding*****
true

相关文章

  • MyBatis 配置之集合的嵌套方式

    MyBatis 配置之集合的嵌套方式

    这篇文章主要介绍了MyBatis 配置之集合的嵌套方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JAVA面试题之Forward与Redirect的区别详解

    JAVA面试题之Forward与Redirect的区别详解

    这篇文章主要给大家介绍了在JAVA面试中可能遇到会遇到的一道题,就是java中Forward与Redirect两者之前的区别,文中介绍的非常详细,对大家具有一定参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Spring中MVC模块代码详解

    Spring中MVC模块代码详解

    这篇文章主要介绍了Spring中MVC模块代码详解,涉及Controller的简单介绍,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • Java基于二分搜索树、链表的实现的集合Set复杂度分析实例详解

    Java基于二分搜索树、链表的实现的集合Set复杂度分析实例详解

    这篇文章主要介绍了Java基于二分搜索树、链表的实现的集合Set复杂度分析,结合实例形式详细分析了Java基于二分搜索树、链表的实现的集合Set复杂度分析相关操作技巧与注意事项,需要的朋友可以参考下
    2020-03-03
  • Java中你真的会用Constructor构造器吗之看完本篇你就真的会了

    Java中你真的会用Constructor构造器吗之看完本篇你就真的会了

    显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。下面文字将对该内容做详细介绍,需要的小伙伴请参考
    2021-09-09
  • 如何使用IDEA新建一个普通的Javaweb项目

    如何使用IDEA新建一个普通的Javaweb项目

    今天给大家普及如何使用IDEA新建一个普通的Javaweb项目及配置tomcat的方法,在文末给大家提到如果不想每次都重启tomcat,可以设置快捷方式,对idea新建Javaweb项目感兴趣的朋友一起看看吧
    2021-06-06
  • springboot2.3 整合mybatis-plus 高级功能及用法详解

    springboot2.3 整合mybatis-plus 高级功能及用法详解

    这篇文章主要介绍了springboot2.3 整合mybatis-plus 高级功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 分享Spring Cloud OpenFeign 的五个优化技巧

    分享Spring Cloud OpenFeign 的五个优化技巧

    这篇文章主要分享的是Spring Cloud OpenFeign 的五个优化技巧,OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件,更多相关内容需要的小伙伴可以参考一下
    2022-05-05
  • Java字节流和字符流及IO流的总结

    Java字节流和字符流及IO流的总结

    本文主要将Java中的IO流进行了梳理,通过将其分成字节流和字符流,以及输入流和输出流分别统计,来建立一个对 Java中IO流全局的概念,通过一些实例来演示了如何通过不同类型的流来组合实现强大灵活的输入和输出,最后介绍了同时支持输入和输出的 RandomAccessFile。
    2021-04-04
  • Spring Boot使用FastJson解析JSON数据的方法

    Spring Boot使用FastJson解析JSON数据的方法

    本篇文章主要介绍了Spring Boot使用FastJson解析JSON数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论