剑指offer面试题3二维数组的查找

http://blog.csdn.net/sunmenggmail/article/details/7668387

思路:从元素的左上角或者右上角左下角右下角开始查找,利用二维数组从上到下,从左到右递增的规律

  1. /** 
  2.  * 递归分治算法学习之二维二分查找 
  3.  * @author Sking 
  4.  
  5. 问题描述: 
  6. 存在一个二维数组T[m][n],每一行元素从左到右递增, 
  7. 每一列元素从上到下递增,现在需要查找元素X(必在二维 
  8. 数组中)在数组中的位置,要求时间复杂度不超过m+n. 
  9.  */  
  10. package 递归分治;  
  11.   
  12. public class BinarySearchInArray {  
  13.     /** 
  14.      * 二维二分搜索的实现 
  15.      * @param array 待查找的二维数组 
  16.      * @param value  待查找的元素 
  17.      * @param m1 数组左上角横坐标 
  18.      * @param n1  数组左上角纵坐标 
  19.      * @param m2 数组右下角横坐标 
  20.      * @param n2  数组右下角纵坐标 
  21.      * @return 待查找元素在二维数组中的位置索引,存在长度为2的数组中 
  22.      *                  未找到则返回null。 
  23.      */  
  24.     int[] binarySearchInArray(int[][] array, int value, int m1, int n1, int m2,  
  25.             int n2) {  
  26.         //(beginX,beginY)表示数组左上角坐标   
  27.         int beginX = m1, beginY = n1;  
  28.         //(endX,endY)表示数组右下角坐标   
  29.         int endX = m2, endY = n2;  
  30.         int[] leftResult = new int[2];//递归查找得到的左下角搜索结果   
  31.         int[] rightResult = new int[2];//递归查找得到的右上角搜索结果   
  32.         int i = (m1 + m2) / 2, j = (n1 + n2) / 2;//不是对角阵   
  33.         if (value < array[m1][n1] || value > array[m2][n2])  
  34.             return null;  
  35.         if (value == array[m1][n1])  
  36.             return new int[] { m1, n1 };  
  37.         if (value == array[m2][n2])  
  38.             return new int[] { m2, n2 };  
  39.         //子矩阵对角线方向上的二分查找,确定递归子矩阵   
  40.         while ((i != m1 || j != n1) && (i != m2 || j != n2)) {  
  41.             if (value == array[i][j])  
  42.                 return new int[] { i, j };  
  43.             else if (value < array[i][j]) {  
  44.                 m2 = i;  
  45.                 n2 = j;  
  46.                 i = (i + m1) / 2;  
  47.                 j = (j + n1) / 2;  
  48.             } else {  
  49.                 m1 = i;  
  50.                 n1 = j;  
  51.                 i = (i + m2) / 2;  
  52.                 j = (j + n2) / 2;  
  53.             }  
  54.         }//如果找到则返回,否则对左下角和右上角矩阵进行递归查找   
  55.         if (i < endX)//右上角递归查找   
  56.             leftResult = binarySearchInArray(array, value, i + 1, beginY, endX,j);  
  57.         if (j < endY)//左下角递归查找   
  58.             rightResult = binarySearchInArray(array, value, beginX, j + 1, i,endY);  
  59.         if (leftResult != null)  
  60.             return leftResult;  
  61.         if (rightResult != null)  
  62.             return rightResult;  
  63.         return null;  
  64.     }  
  65.   
  66. }  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值