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