剑指offer 二维数组的查找
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 二维数组的查找相关的知识,希望对你有一定的参考价值。
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
第一种方法,在每一行进行二分查找,NlogN。
第二种方法,也可能是最好的,因为已经是有序的,我们选取左下角或者右上角,每次进行判断大小,选择上移或者右移,这样每次都有贪心选择,但是这样的时间复杂度怎么确定呢?
特别注意边界的判断!否则空指针异常。获得传进来的数组和获得下标之间尤其要判断。
class Solution { public boolean Find(int target, int [][] array) { if(array.length == 0 ) return false; //从左下角开始 int r = array.length - 1; int l = 0; while(true) { if(r<0 || l>array[0].length-1) return false; if(array[r][l] > target) { r--; }else if(array[r][l] < target) { l++; }else { return true; } } } } public class Main { public static void main(String[] args) { int a = 16; int[][] array = {}; Solution so = new Solution(); System.out.println(so.Find(16,array)); } }
class Solution { public boolean Find(int target, int [][] array) { for(int i = 0; i < array.length; i++) { int l = 0; if(array.length<=0) return false; if(array[0].length<=0) return false; int r = array[0].length-1; while(l<=r) { int mid = (l+r)/2; if(target>array[i][mid]) { l = mid+1; } else if(target<array[i][mid]) { r = mid-1; } else return true; } } return false; } } public class Main { public static void main(String[] args) { int a = 16; int[][] array = {{1,3,4},{3,16,1}}; Solution so = new Solution(); System.out.println(so.Find(16,array)); } }
以上是关于剑指offer 二维数组的查找的主要内容,如果未能解决你的问题,请参考以下文章