二维数组中的查找

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

 

思路:先在对角线处二分,

当这个点的值等于目标点的值时,返回true

当这个点的值小于目标点的值时,分别二分查找该点右侧和下侧的所有数。

当这个点的值大于目标点的值时,分别二分查找该点左侧和上侧的所有数

public class Solution {
    public boolean Find(int target, int [][] array) {
       int upRow = 0;
        int downRow = array.length-1;
        int leftCol = 0;
        int rightCol = array[0].length-1;
        while(true)
        {
            if(upRow > downRow)            break;
            if(leftCol > rightCol)        break;
            int midRow = (upRow+downRow)/2;
            int midCol = (leftCol+rightCol)/2;
            if(array[midRow][midCol] == target)
                return true;
            else if(array[midRow][midCol] < target)    
            {
                if(array[midRow][array[0].length-1]==target || array[array.length-1][midCol]==target )
                    return true;
                if(array[midRow][array[0].length-1] > target)
                {
                    int left = midCol+1;
                    int right =  array[0].length-1;
                    int midc;
                    while(left<=right)
                    {
                        midc = (left+right)/2;
                        if(array[midRow][midc] == target)
                           return true;
                        else if(array[midRow][midc] < target)
                           left = midc + 1;
                        else
                           right = midc - 1;
                    }
                }
                if(array[array.length-1][midCol] > target)
                {
                    int left = midRow+1;
                    int right = array.length-1;
                    while(left<=right)
                    {
                        int midr = (left+right)/2;
                        if(array[midr][midCol] == target)
                           return true;
                        else if(array[midr][midCol] < target)
                           left = midr + 1;
                        else
                           right = midr - 1;
                    }
                }
                leftCol = midCol + 1;
                upRow = midRow + 1;
            }
            else if(array[midRow][midCol] > target)
            {
                if(array[midRow][0]==target || array[0][midCol]==target )
                        return true;
                if(array[midRow][0] < target)
                {
                    int left = 0;
                    int right = midCol-1;
                    int midc;
                    while(left<=right)
                    {
                        midc = (left+right)/2;
                        if(array[midRow][midc] == target)
                           return true;
                        else if(array[midRow][midc] < target)
                           left = midc + 1;
                        else
                           right = midc - 1;
                    }
                }
                if(array[0][midCol] < target)   
                {
                    int left = 0;
                    int right = midRow-1;
                    while(left<=right)
                    {
                        int midr = (left+right)/2;
                        if(array[midr][midCol] == target)
                           return true;
                        else if(array[midr][midCol] < target)
                           left = midr + 1;
                        else
                           right = midr - 1;
                    }
                }
                rightCol = midCol - 1;
                downRow = midRow - 1;
            }
        }
        return false;
    }
}

 

优秀题解:左上角为最小点,右下角为最大点,选取左下角或右上角的点(可以视为中间点),从中间点开始,不断目标点比较,目标点大则往右或下移动,反之则往上或左移动。

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

 

posted @ 2019-03-26 13:56  萌新上路  阅读(109)  评论(0编辑  收藏  举报