二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

法一:两个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     }
View Code

法二:外层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     }
View Code

法三:一层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     }
View Code
原文地址:https://www.cnblogs.com/cing/p/8578986.html