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

 更新时间: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

相关文章

  • java 中clone()的使用方法

    java 中clone()的使用方法

    这篇文章主要介绍了java 中clone()的使用方法的相关资料,希望通过本文能帮助大家能掌握clone()的克隆方法,需要的朋友可以参考下
    2017-09-09
  • java Stream操作转换方法

    java Stream操作转换方法

    文章总结了Java 8中流(Stream) API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、函数式接口等,展示了流API在处理集合数据时的强大和灵活性,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • 解决RedisTemplate存储至缓存数据出现乱码的情况

    解决RedisTemplate存储至缓存数据出现乱码的情况

    这篇文章主要介绍了解决RedisTemplate存储至缓存数据出现乱码的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Java7之forkjoin简介_动力节点Java学院整理

    Java7之forkjoin简介_动力节点Java学院整理

    Java7引入了Fork Join的概念,来更好的支持并行运算。接下来通过本文给大家分享Java7之forkjoin简介,感兴趣的朋友一起看看吧
    2017-06-06
  • java 读写锁的使用及它的优点

    java 读写锁的使用及它的优点

    这篇文章主要介绍了java 读写锁的使用及它的优点,读写锁的特点就是是读读不互斥、读写互斥、写写互斥,下面具体使用分享需要的小伙伴可以参考一下
    2022-05-05
  • Java中byte输出write到文件的实现方法讲解

    Java中byte输出write到文件的实现方法讲解

    今天小编就为大家分享一篇关于Java中byte输出write到文件的实现方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • java 排序算法之快速排序

    java 排序算法之快速排序

    这篇文章主要介绍了java 排序算法之快速排序,文中通过图片和代码讲解相关知识非常详细,大家如果有需要的话可以参考一下这篇文章
    2021-09-09
  • Java面试高频问题之RabbitMQ系列全面解析

    Java面试高频问题之RabbitMQ系列全面解析

    在介绍RabbitMQ之前实现要介绍一下MQ,MQ是什么?MQ全称是Message Queue,可以理解为消息队列的意思,简单来说就是消息以管道的方式进行传递。RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言的
    2021-11-11
  • Netty学习教程之基础使用篇

    Netty学习教程之基础使用篇

    Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。下面这篇文章主要给大家介绍了关于Netty基础使用的相关资料,需要的朋友可以参考下。
    2017-05-05
  • 详解maven的install的作用

    详解maven的install的作用

    这篇文章主要介绍了详解maven的install的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论