二维数组查找19.9.8

首先是两种思路:

① 假设数组是M*N的,每一行用二分搜索,这样最坏的时间复杂度就是M*Log2N,但这种方法只用到了一个条件:从左到右有序。并不是题目希望我们的方法

② 二分思想,从左下开始遍历,或者从右上开始遍历,这样最坏的时间复杂度就是O(n),下面的代码按照左下开始:(注意:提交时一直提示段错误,思考了很久才发现,对于下面第一种代码,要先判断数组是否存在,)

 

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {

        int row = array.size();
        int column = array[0].size();
        int key_row = row-1, key_column = 0;
        //判断是否存在!!!
        if(row ==0 || column == 0)
            return 0;
        if(target < array[0][0] || target > array[row-1][column-1])
            return 0;
        //应用本题所给信息,从左下边开始找,为的是利用一个二分的思想
        while(key_column < column && key_row >= 0){
            if(target == array[key_row][key_column])
                return 1;
            else if(target > array[key_row][key_column])
                key_column++;
            else if(target < array[key_row][key_column])
                key_row--;
        }
        return 0;
    }
};
//加上下面这段代码,应该会优化一点点
  if(target < array[0][0] || target > array[row-1][column-1])
            return 0;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值