题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
法一:两个for循环,o(n^2),直接查找。代码如下:
1 public boolean Find(int target, int[][] array) { 2 boolean flag = false; 3 for(int i = 0; i < array.length; i++) { 4 for(int j = 0; j < array[i].length; j++) { 5 if(target == array[i][j]) { 6 flag = true; 7 break; 8 } 9 } 10 } 11 return flag; 12 }
法二:外层for循环,内层二分,o(nlogn)。代码如下:
1 public boolean Find(int target, int[][] array) { 2 if(array.length == 0 || array[0].length == 0) { 3 return false; 4 } 5 boolean flag = false; 6 int left, right, mid, len = array.length; 7 for(int i = 0; i < len; i++) { 8 left = 0; 9 right = len - 1; 10 while(left <= right) { 11 mid = (right + left) / 2; 12 if(array[i][mid] < target) { 13 left = mid + 1; 14 } 15 else if(array[i][mid] > target) { 16 right = mid - 1; 17 } 18 else { 19 flag = true; 20 break; 21 } 22 } 23 if(flag == true) { 24 break; 25 } 26 } 27 return flag; 28 }
法三:一层for循环,o(n)。从左下角开始遍历,如果当前值<target,则向右走,如果当前值>target,则向上走。代码如下:
1 public boolean Find(int target, int[][] array) { 2 if(array.length == 0 || array[0].length == 0) { 3 return false; 4 } 5 int i = array.length - 1, j = 0, len = array[0].length; 6 boolean flag= false; 7 while(i >= 0 && j < len) { 8 //向右走 9 if(array[i][j] < target) { 10 j++; 11 } 12 //向上走 13 else if(array[i][j] > target) { 14 i--; 15 } 16 else { 17 flag = true; 18 break; 19 } 20 } 21 return flag; 22 }