[java]

/**

* 递归分治算法学习之二维二分查找

* @author Sking

问题描述:

存在一个二维数组T[m][n],每一行元素从左到右递增,

每一列元素从上到下递增,现在需要查找元素X(必在二维

数组中)在数组中的位置,要求时间复杂度不超过m+n.

*/

package 递归分治;

public class BinarySearchInArray {

/**

* 二维二分搜索的实现

* @param array 待查找的二维数组

* @param value  待查找的元素

* @param m1 数组左上角横坐标

* @param n1  数组左上角纵坐标

* @param m2 数组右下角横坐标

* @param n2  数组右下角纵坐标

* @return 待查找元素在二维数组中的位置索引,存在长度为2的数组中

*                  未找到则返回null。

*/

int[] binarySearchInArray(int[][] array, int value, int m1, int n1, int m2,

int n2) {

//(beginX,beginY)表示数组左上角坐标

int beginX = m1, beginY = n1;

//(endX,endY)表示数组右下角坐标

int endX = m2, endY = n2;

int[] leftResult = new int[2];//递归查找得到的左下角搜索结果

int[] rightResult = new int[2];//递归查找得到的右上角搜索结果

int i = (m1 + m2) / 2, j = (n1 + n2) / 2;//不是对角阵

if (value < array[m1][n1] || value > array[m2][n2])

return null;

if (value == array[m1][n1])

return new int[] { m1, n1 };

if (value == array[m2][n2])

return new int[] { m2, n2 };

//子矩阵对角线方向上的二分查找,确定递归子矩阵

while ((i != m1 || j != n1) && (i != m2 || j != n2)) {

if (value == array[i][j])

return new int[] { i, j };

else if (value < array[i][j]) {

m2 = i;

n2 = j;

i = (i + m1) / 2;

j = (j + n1) / 2;

} else {

m1 = i;

n1 = j;

i = (i + m2) / 2;

j = (j + n2) / 2;

}

}//如果找到则返回,否则对左下角和右上角矩阵进行递归查找

if (i < endX)//右上角递归查找

leftResult = binarySearchInArray(array, value, i + 1, beginY, endX,j);

if (j < endY)//左下角递归查找 
            rightResult = binarySearchInArray(array, value, beginX, j + 1, i,endY);

if (leftResult != null)

return leftResult;

if (rightResult != null)

return rightResult;

return null;

}

}

递归分治算法之二维数组二分查找(Java版本)的更多相关文章

  1. JavaScript 递归法排列组合二维数组2

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

  2. JavaScript 递归法排列组合二维数组

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

  3. ACM_二维数组的查找

    二维数组的查找 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个n*m的二维数组,保证a[i][j] < a[i+1 ...

  4. 剑指Offer01之二维数组中查找目标数

    剑指Offer之二维数组中查找目标数 题目描述 ​ 在一个二维数组中(每个一维数组的长度相等),每一行都是从左到右递增的顺序排序,每一列都是从上到下递增的顺序排序,输入这样一个二维数组和一个整数,判断 ...

  5. 《剑指Offer》算法题——二维数组查找

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

  6. 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

    引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数   ...

  7. 牛客网剑指offer 二维数组的查找

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

  8. 剑指 offer set 1 二维数组中查找

    总结 1. 二维数组搜索题遇到两个了, 一个是 Leetcode 上 search in 2D matrix. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...

  9. word search(二维数组中查找单词(匹配字符串))

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

随机推荐

  1. cmd 运行(打包后的)java程序

    package cn.imeixi.chapter1.exer; public class Exer10PrintArgs { public static void main(String[] arg ...

  2. RHEL7 DNS 服务 unbound 测试

    测试环境: 物理机win10系统,虚拟机软件使用Oracle VirtualBox. rhel1.rusky.com 192.168.100.1 RHEL7(辅DNS) rhel2.rusky.com ...

  3. Inno Setup入门(六)——在程序目录下创建文件夹

    创建文件夹可以使用[dirs]段实现,代码如下: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TEST DefaultDirName="E:\TES ...

  4. Redis-Redi事务注意事项

    当客户端处于非事务状态下时, 所有发送给服务器端的命令都会立即被服务器执行.但是, 当客户端进入事务状态之后, 服务器在收到来自客户端的命令时, 不会立即执行命令, 而是将这些命令全部放进一个事务队列 ...

  5. Swift3 根据秒数获取视频时长(转换成00:00:00时间格式)以及将时长转换成秒

    直接代码了: /// 秒转换成00:00:00格式 /// /// - Parameter secounds: <#secounds description#> /// - Returns ...

  6. 简述MVC

    强调:mvc不是框架而是一种设计模式 分层结构的好处:1.降低了代码之间的耦合性 2.提高了代码的重用性 一. 概述 MVC的全名Model View Controller,即模型-视图-控制器的缩写 ...

  7. iOS 播放远程网络音乐的核心技术点

    一.前言 这两天做了个小项目涉及到了远程音乐播放,因为第一次做这种音乐项目,边查资料边做,其中涉及到主要技术点有: 如何播放远程网络音乐 如何切换当前正在播放中的音乐资源 如何监听音乐播放的各种状态( ...

  8. Python学习笔记(十一)—— 函数式编程

    一.函数式编程理念 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变 ...

  9. CocoaPods iOS 开源库管理

    1.CocoaPods 简介 1.1 CocoaPods CocoaPods 是 macOS 和 iOS 下的一个第三类库管理工具,通过 CocoaPods 工具我们可以为项目添加被称为 " ...

  10. Git 分支(分布式版本控制系统)

    前言 几乎所有的版本控制系统都以某种形式支持分支.使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线.在很多版本控制系统中,这是一个略微低效的过程--常常需要完全创建一个源代码目录的 ...