剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

分析:

二维数组这里把它看作一个矩形结构,如图所示:


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果,

以查找9为例,

从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧;


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

然后看4(1,1),4<9,


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

然后看10(2,2),10>9,这个时候可以确定在10的右上方,或者左下方,


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

然后可以考虑使用递归黄色的两个方框,设an>x时是(x,y),an-k>x时是(x0,y0),那么此次递归的起始点因该是:右上(x,y0),左下(x0,y)。

左下的方框,4(2,0),4<9;再看8(3,1),8<10,可以确定不在左下方框;

右上的方框,8(0,2),8<9;再看12(1,3),12>9,再次递归,(1,2)或(0,3)都可以找到。

看似可以解决问题,但是,这个时候的矩形必须是正方形才行。。。。。。

       
       
       
       
       
       
       
       

如上图所示,就没办法了(当然,可以通过宽高的关系,计算出选择纵向移动多少次,横向移动 多少次,可以正好走个对角,但是,太麻烦了。。。。),所以,这么想是不对滴。。。。。。

然后我们考虑可以通过比较一次后可以去掉一行或者一列,那这个方法也可以算不错的了。

以查找10为例,

1.如果从左上角开始找,1<10,发现除了一个个往后比没有什么更好的办法了 ;

2.如果从右上角(0,3)开始找,9<10,由于每行从左到右递增,所以可以把第一行(0)排除掉了;


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

然后看第二行最后一个数(1,3),12>10,由于每列从上到下递增,所以可以把最后一列(3)排除;


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

然后看(1,2),9<10,排除行1;


1


2


8


9


2


4


9


12


4


7


10


13


6


8


11


15

然后看(2,2),10==10,找到目标,返回行列号。

3.除了从右上角开始分析有较好的效果外,可以发现从左下角也可以以经过一次比较排除一行或者是一列;从右下角分析则同1一样,效率不高。

代码:

package study;
/**
 * 二维数组中,每行从左到右递增,每列从上到下递增,
 * 设计一个算法找其中的一个数
 * @author cnx
 * @CreateDate ; 2014年9月28日 上午10:14:21
 */
public class FindInMatrix {
    public static void main(String[] args) {
        FindInMatrix f = new FindInMatrix();
        int a[] = f.find(f.a1, 12);
        if(a!=null)
        System.out.println("a1 find 12. row= "+a[0]+"; col="+a[1]);
        a = f.find(f.a2, 18);
        System.out.println("a2 find 18. row= "+a[0]+"; col="+a[1]);
        a = f.find(f.a2, 2);
        System.out.println("a2 find 2. row= "+a[0]+"; col="+a[1]);
        a = f.find(f.a2, 7);
        System.out.println("a2 find 7. row= "+a[0]+"; col="+a[1]);
    }

    public int a1 [][] = null;
    public int a2 [][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};  //查找18,2,7

    public int[] find(int a[][], int des){
        //存行列数
        int result[] = {-1,-1};

        if(a != null && a.length>0 && a[0].length>0){
            int row = 0;
            int col = a[0].length-1;
            while (row<a.length && col>=0) {
//                System.out.println(a.length + " ," +a[0].length);
                if (a[row][col] == des) {
                    result[0] = row;
                    result[1] = col;
                    break;
                }
                if (a[row][col] > des) {
                    col--;
                }
                else {
                    row++;
                }
            }
        }
        else
            result = null;

        return result;
    }

}
时间: 2024-08-06 21:50:46

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数的相关文章

【剑指offer】二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析: 首先选择数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.依次类推,直到查找范围为空. 示例程序: #include <stdio.h> #include <stdlib.h> int

剑指OFFER之二维数组中的查找(九度OJ1384)

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a

《剑指Offer 1.二维数组中的查找》2019-03-25

剑指Offer  第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 本人简单的解题思路  就是通过二重循环,遍历.查找数组中是否有目标数字,思路是简单的,但是有个小坑 ,就是没有进行数组越界判断 少判断了  array = [ [ ] ] 这种情况,最终通过的代码为 public class Solution { public bool

剑指offer(2) - 二维数组中的查找

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行.每列都是递增顺序,如果在这个数组中查找数字7,则返回true,如果查找数字5,由于数组中不含有该数字,则返回false. 1   2   8   9 2  4   9   12 4  7  10   13 6  8   11   15 public class FindFromMatrix { priv

剑指OFFER之二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

【剑指offer】二维数组中的查找☆

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 自己的思路实在是傻×了,先看下正确思路吧 把当前数字定位在第一行,最后一列.如果数字小则增大行,如果数字大则减小列!O(M+N) bool Find3(vector<vector<int> > array,int target) { if(array.empty() && array[0].

《剑指Offer》二维数组中的查找

二维数组中的查找 题目描述:在一个二维数组中,每个一维数组的长度相同,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:选取二维数组的右上角元素, 如果元素大于target(表示输入的那个整数),则删除整列: 如果元素小于target,则删除整行. 循环的条件:遍历完二维数组中的元素后,仍然找不到target值,循环停止.则,对于row行,从上0开始递增,执行for循环的条件是小于行的长度:

剑指offer:二维数组中的查找

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析:由于所给的二维数组在一定程度上是有序的,即每一行.每一列都是有序的,但是行与行之间不一定是有序的.如: 1 2 32 3 43 4 5 第二行的2和第一行的3并不是有序的.因此,如果从左上角坐标为(0, 0)开始遍历这个二维数组的话,如果当前的数字小于要查找的目标数字,那么要查找的数字就