题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
法一:两个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 }
来源:https://www.cnblogs.com/cing/p/8578986.html
