剑指Offer经典算法题-二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法一、穷举法"暴力破解"
依次遍历数组中每个元素,一一比对
public class Solution { public boolean Find(int target, int [][] array) { for(int i =0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ if(array[i][j]==target){ return true; } } } return false; } }
方法二、从左下角出发,遍历
分析该二维数组的特性:
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序
从中我们不难得知,左下角的数(记为s)是首列最大的数,同时是末行最小的数
然后我们从这个数s出发,依次与目标值target做比对
1.当s<target时,因为它处于该行最小的值,要想使值变大,位置右移
2.当s>target时,因为它处于该列最大的值,要想使值减小,位置上移
……
如此循环,直至找到s=target的情况
public class Solution { public boolean Find(int target, int [][] array) { int rows = array.length; //行 if (rows == 0){ return false; } int cols = array[0].length; //列 if (cols == 0){ return false; } //将行列定位至左下角 int row = rows -1; int col = 0; while(row >= 0 && col < cols){ if(array[row][col] > target){ row --; }else if(array[row][col] < target){ col ++; }else{ return true; } } return false; } }