剑指offer_by牛客网
Posted yunyouhua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer_by牛客网相关的知识,希望对你有一定的参考价值。
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 }
答案:
从左下角(或右上角,进行二分)时间复杂度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 }
以上是关于剑指offer_by牛客网的主要内容,如果未能解决你的问题,请参考以下文章