剑指01 - 二维数组中的查找

剑指01 - 二维数组中的查找

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

解法一:

public boolean Find(int target, int [][] array) {
    int tempJend = array[0].length-1;
    for(int i=0; i<=array.length-1; i++){
        for(int j=tempJend; j>=0; j--){
            if(array[i][j] > target) {
                continue;
            } else if(array[i][j] < target) {
                tempJend = j;
                break;
            } else {
                return true;
            }
        }
    }
    return false;
}

时间复杂度 n^2

解法二:

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

时间复杂度 nlogn

--- update --- 2021.03.26 ---

解法三、从第一行的最后一个元素出发,比target大的都在下边,比target小的都在左边,时间复杂度O(n)

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0) return false;
        int r = 0; // 横坐标
        int c = array[0].length - 1; // 纵坐标
        while(r<array.length && c >=0) {
            if(array[r][c] == target) {
                return true;
            }else if(array[r][c] > target) {
                c--; 
            }else if(array[r][c] < target) {
                r++;
            }
        }
        return false;
    }
}

小总结:有排好序的数组,查找时首先想到“二分法”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值