二维数组中的查找

2017-08-23  本文已影响0人  克里斯加德纳

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

语言Java

方法一:

1.遍历每一行
2.对每一行进行二分法查找

public class Solution {
    public boolean Find(int target, int [][] array) {
        for(int i = 0;i<array.length;i++){
            int low = 0;
            int high = array[i].length-1;
            while(low<=high)
            {
                int mid = (low+high)/2;
                if(target>array[i][mid])
                   low = mid+1;
                else if (target<array[i][mid])
                   high = mid-1;
                else
                   return true; 
            }
        }
        return false;
    }
}

注意:二分法while的循环调节必须是带有等号、否则会少遍历最后一个数;

方法二:
1.从数组的左下那数开始(右上也可、左上和右下不可以)与目标数进行比较
2.如果大于目标数则在该数的左边、如果小于这个数则在该数的上边

public class Solution {
    public boolean Find(int target, int [][] array) {
        int x = array.length - 1;
        int y = 0;
        while(x>=0&&y<array[x].length)
        {
            if(target==array[x][y]){
                return true;
            }else if(target >array[x][y])
                y ++;
            else
                x --;
        }
        return false;
    }
}

错误方法
1.对列二分法
2.对行二分法

public class Solution {
    public boolean Find(int target, int [][] array) {
        int low = 0;
        int high = array.length-1;
        while(low<=high)
        {
            int mid = (low+high)/2;
            if(target>array[mid][0])
                low = mid + 1;
            else if(target<array[mid][0])
                high = mid - 1;
            else
                return true;
        }
        int rowlow = 0;
        int rowhigh = array[high].length-1;
        while(rowlow<=rowhigh)
        {
            int mid = (rowlow+rowhigh)/2;
            if(target>array[high][mid])
                rowlow = mid + 1;
            else if(target<array[high][mid])
                rowhigh = mid - 1;
            else
                return true;
        }
        return false;
    }
}

这个方法不能通过的原因如下

测试用例:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

对应输出应该为:

true

你的输出为:

false
上一篇 下一篇

猜你喜欢

热点阅读