题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路一:
把二维数组看成二叉树,左下角的的树就是中点,小于target往上走,大于target往右走。其实就是一棵二叉查找树。
代码实现:
1 public class Solution { 2 public boolean Find(int target, int [][] array) { 3 if(array == null || array.length == 0|| array[0] == null || array[0].length == 0){ 4 return false; 5 } 6 int len = array.length-1; 7 int len2 = array[0].length-1; 8 if (array[0][0] > target) 9 return false; 10 if (array[len][len2] < target) 11 return false; 12 int i = len; 13 int j = 0; 14 while (i >= 0 && j <= len2){ 15 if (array[i][j] == target){ 16 return true; 17 }else if (array[i][j] < target){ 18 j++; 19 }else{ 20 i--; 21 } 22 } 23 return false; 24 25 } 26 }
思路二:
用二分查找,把矩阵看成上三角和下三角,分别进行二分查找。
代码实现:
public static boolean Find(int [][] array,int target) { if(array == null || array.length == 0 || array[0] == null || array[0].length == 0){ return false; } int low,high,mid; for(int j = 0; j < array.length; j++){ low = j; high = array.length - 1; mid = (low + high) / 2; while(low <= high){ System.out.println(array[mid][j]); if(array[mid][j] == target){ return true; } if(array[mid][j] > target){ high = mid - 1; }else{ low = mid + 1; } mid = (low + high) / 2; } } for(int i = 0; i < array.length - 1; i++){ low = i + 1; high = array[i].length -1; mid = (low + high) / 2; while(low <= high){ System.out.println(array[i][mid]); if(array[i][mid] == target){ return true; } if(array[i][mid] > target){ high = mid - 1; }else{ low = mid + 1; } mid = (low + high) / 2; } } return false; }
顺序查找就不推荐了。