递归分治算法之二维数组二分查找(Java版本)
[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版本)的更多相关文章
- JavaScript 递归法排列组合二维数组2
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- JavaScript 递归法排列组合二维数组
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- ACM_二维数组的查找
二维数组的查找 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个n*m的二维数组,保证a[i][j] < a[i+1 ...
- 剑指Offer01之二维数组中查找目标数
剑指Offer之二维数组中查找目标数 题目描述 在一个二维数组中(每个一维数组的长度相等),每一行都是从左到右递增的顺序排序,每一列都是从上到下递增的顺序排序,输入这样一个二维数组和一个整数,判断 ...
- 《剑指Offer》算法题——二维数组查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Solutio ...
- 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容
引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储 首先考虑用二维数组存储所有行数,列数 ...
- 牛客网剑指offer 二维数组的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路 该题有很多种 ...
- 剑指 offer set 1 二维数组中查找
总结 1. 二维数组搜索题遇到两个了, 一个是 Leetcode 上 search in 2D matrix. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...
- word search(二维数组中查找单词(匹配字符串))
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
随机推荐
- java的BASE64Encoder,BASE64Decoder加密与解密
package com.app.common; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.Fi ...
- Chrome 好玩的插件
1 Lastpass : 用来把往各个网址的密码云端存储. 2 EditThisCookie : 查看网页的Cookie 3 Postman Interceptor : 用来配合Postman 进 ...
- 在容器服务kubernetes上配置https
当前容器服务Kubernetes集群支持多种应用访问的形式,最常见形式如SLB:Port,NodeIP:NodePort和域名访问等.但是Kubernetes集群默认不支持HTTPS访问,如果用户希望 ...
- (原)torch,caffe,python中读入数据的默认范围
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6554388.html 之前torch(image.load).caffe(默认的).python(使用 ...
- Hopfield神经网络和TSP问题
一.TSP问题 旅行商问题,又叫货郎担问题.它是指如下问题:在完全图中寻找一条最短的哈密尔顿回路. 哈密尔顿回路问题:给定一个图,判断图中是否存在哈密尔顿回路. 哈密尔顿回路:寻找一条回路,经过图中所 ...
- Nginx防爬虫或限制浏览器访问
假定一个场景:某个网站它可能不希望被网络爬虫抓取,例如测试环境不希望被抓取,以免对用户造成误导,那么需要在该网站中申明,本站不希望被抓取.有如下方法: 方法一:修改nginx.conf,禁止网络爬虫的 ...
- linux下的工作模型以及Nginx工作原理
Web服务器主要任务就是处理来自客户端的请求,一般情况下Web服务器处理并发连接请求的工作模型有以下几种方式: 1.单线程web服务器(Single-threaded web servers) 此 ...
- 自动化部署必备技能—定制化RPM包[转载]
回顾下安装软件的三种方式: 1.编译安装软件,优点是可以定制化安装目录.按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长. 2.yum安装软件,优点是全自动化 ...
- 怎样看待IT界业务,技术,管理的各自比重
怎样看待IT界业务,技术,管理的各自比重 技术是根本,业务是个人能力的体现,管理一般随意,追求简单,眼光向IBM等有优秀管理经验的大公司看齐 重点从个人的喜好.性格方面来考虑分配比重,可以加上 ...
- xcode修改项目名后反复出现 clang error
xcode修改项目名后反复出现 clang error, 提示 ld: file not found . 并且该错误并不是出现在项目编译阶段,而是项目的Tests 的link阶段, 同时提示 xct ...