牛客剑指offer 1.二位数组中的查找

最优解法

借助于二分搜索的拓展。
详见官方题解:
以右上角的元素为基准,若attr 若attr>tag,tag必定不在attr的正下方,范围缩减一列,attr左移一格;
直至查遍所有元素。
这种做法,每次缩减一格或一行,最坏情况下,时间复杂度为o(m+n) m,n为数组行数和列数。
代码如下:

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

感悟

刚开始,我也想到了二分法,但我的思维局限在了上面,而不是上面。
其实二分法的精髓是在上面,有些时候不一定能平分所有解空间,但可以将其分成多个部分,然后进行缩减。
思维一定要灵活才行。

你可能感兴趣的:(日常刷题,二分法,algorithm)