剑指Offer JZ1 二维数组中的查找 C++实现

题目描述

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

解题思路


方法一:暴力搜索

1、思路:遍历数组中的所有元素并与该整数进行比较。

2、代码:

class Solution {
public:
    bool Find(int target, vector<vector<int>> array) {
        if (array.empty() || !target)
            return false;
        int i, j;
        for (i = 0; i < array.size(); i++) {
            for (j = 0; j < array[0].size(); j++) {
                if (target == array[i][j]) return true;
            }
        }
        return false;
    }
};

3、复杂度:

时间复杂度:O(n^2);

空间复杂度:O(1)。


方法二:二分法查找

1、思路:一般在有序的一维数组中,用二分法查找某数是通过比较“中间点”然后不断缩小查找范围,而在此题中虽然是二维数组,但是在数组的行列上存在有序关系,如果能想到以数组的右上角或左下角为“中间点”进行比较,则此题便能迎刃而解。下面以右上角为例,由于数组每一行从左到右递增,每一列从上到下递增,因此:

  • 若目标值小于当前右上角值,则目标值必定小于右上角值所在列,因此左移一列;
  • 若目标值等于当前右上角值,则返回True,表示数组中含有该整数;
  • 若目标值大于当前右上角值,则目标值必定大于右上角值所在行,因此下移一行;

重复上述步骤,若数组行或列索引值越界,则判断数组中不存在该整数。

2、代码:

class Solution {
public:
    bool Find(int target, vector<vector<int>> array) {
        if (array.empty() || !target)
            return false;
        int i = 0, j = array[0].size()-1;
        //这里要注意循环终止判断条件为数组索引越界
        while(i < array.size() && j > -1) {
            if (target < array[i][j]) j--;
            else if (target > array[i][j]) i++;
            else return true;                 
        }
        return false;
    }
};

3、复杂度:

时间复杂度:O(m+n),其中m和n分别为数组的行数和列数;

空间复杂度:O(1)。


方法三:十字分割法

1、思路:把二维数组分割成四个等大小区域,比较目标值与中间值的大小,可以排除左上角或右下角区域,对剩下三部分区域继续进行递归判断,每次都可以排除1/4的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值