剑指Offer(数组)-二维数组的查找
(二位数组的查找)题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解决办法一:利用二分查找的方法
利用 while ( low <= high) 来实现遍历查找,和目标值进行比较,若目标值在左边就 high = mid -1 ,若目标值在右边就 low = mid + 1。
public class Solution { public boolean Find(int target, int [][] array) { //利用二分查找的方法,时间复杂度是nlogn for(int i=0; i<array.length; i++){ int low =0; int high =array[i].length - 1; while(low <= high){ int mid = (low + high)/2; if(array[i][mid] > target){ high = mid -1; }else if(array[i][mid] < target){ low = mid + 1; }else{ return true; } } } return false; } }
解决办法二:利用自身数组的特性,自上而下和自左向右是递增的,
利用左下角的元素进行与目标值的比较,若目标值比它大说明在左下角元素所在列的右边,若目标值比它小则说明在左下角元素所在行的上一行,这样子能比较到和目标值相同的元素。
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){ col++; }else if(array[row][col] > target ){ row--; }else{ return true; } } return false; } }
需要注意的是 col < cols , 这一点是必须的,因为若条件里面判断通过,但是在逻辑里面多了col ++ 的话,就会导致数组越界异常。