1. 程式人生 > >劍指offer_by牛客網

劍指offer_by牛客網

src targe end fin spl bsp hide 劍指offer 是否

2017/9/6

二維數組中的查找 m*n

在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。

找是否存在target

我的想法,for循環判斷每行首尾,再進行二分

O(m*logn)

技術分享
 1 public class Solution {
 2     public boolean Find(int target, int [][] array) {
 3         if (array == null || array.length == 0 || array[0].length == 0) {
 4             return false;
 5
} 6 int row = array.length; 7 int col = array[0].length; 8 for (int i = 0; i < row; i++) { 9 int start = 0; 10 int end = col - 1; 11 if (array[i][0] <= target && array[i][end] >= target) { 12 while (start + 1 < end) {
13 int mid = start + (end - start) / 2; 14 if (array[i][mid] == target) { 15 return true; 16 } else if (array[i][mid] > target) { 17 end = mid; 18 } else{ 19 start = mid;
20 } 21 } 22 if (array[i][start] == target) { 23 return true; 24 } 25 if (array[i][end] == target) { 26 return true; 27 } 28 } 29 30 } 31 return false; 32 } 33 }
View Code

答案:

從左下角(或右上角,進行二分)時間復雜度O(m+n)

技術分享
 1 public class Solution {
 2     public boolean Find(int target, int [][] array) {
 3         if (array == null || array.length == 0 || array[0].length == 0) {
 4             return false;
 5         }
 6         int row = array.length;
 7         int col = array[0].length;
 8         int i = 0;
 9         int j = col - 1;
10         while (i < row && j >= 0) {
11             if (array[i][j] == target) {
12                 return true;
13             } else if (array[i][j] > target) {
14                 j--;
15             } else {
16                 i++;
17             }
18         }
19         return false;
20     }
21 }
View Code

劍指offer_by牛客網