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

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

思路:

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7

这样一个数组,很符合题意,我们如果要是查找有没有4,从哪里开始找,我们分析一下这个二维数组的特点,1的位置,向右是变大的,向下也是变大的,5的位置,向下是变大的,向左是变小的,3向上是变小的,向右是变大的,7两边都是变小的,那么我们在查找过程,应该有两面,如果大或者如果小,我们应该不会不知道去那边,所以查找只能从3或者5开始,那样更好的确定移动的方向,不会把数据丢掉,
本文是从3开始查找,
那么需要注意哪些点呢,比方说我们查找8,这是一个三行5列 (2,4)的数据,我们从3(2,0)开始找,8比3大,所以坐标应该向右移动,列坐标加一,接着找,还是小于8的,那么列还是加加,当到7(2,4)的时候,还不行,列加加,(2,5),坐标越界,说明不存在这个数据,查找0也是一样的,只是行坐标的越界,是小于0,

代码实现

package com.itzmn.offer;


/**
 * @Auther: 张梦楠
 * @Date: 2018/7/27 12:13
 * :https://www.jianshu.com/u/d611be10d1a6
 * 码云:https://gitee.com/zhangqiye
 * @Description:
 */
public class NuberOne {


    public static void main(String[] args) {

        int target = 1;
        int[][] array = {{2, 3, 4, 5}, {3, 4, 5, 6}, {4, 5, 6, 7}};

        boolean find = new NuberOne().Find(target, array);
        System.out.println(find);
    }

    public boolean Find(int target, int[][] array) {

        int row = array.length-1;
        int col = array[0].length-1;

        return get(target,array,row,0,col);

    }

    public boolean get(int target , int[][] array, int row,int col,int truecol){


        if (row < 0 || col > truecol){
            return false;
        }
        if (array[row][col] == target) {
            return true;
        }

        if (array[row][col] < target){
            return get(target,array,row,++col,truecol);
        }
        if (array[row][col] > target){
            return get(target,array,--row,col,truecol);
        }


        return true;
    }

}

在做题的时候也参考了别人的思路,希望大家可以多多指点,优化一下,
QQ群:552113611

你可能感兴趣的:(剑指offer(一)二维数组中的查找)