刷题总结:二维数组中查找整数

二维数组中查找是否存在该数

1.条件描述:

  1. 定义一个二维数组(其中包含的一维数组的长度相同)。
  2. 行中从左至右进行递增。
  3. 列中从上至下进行递减。

2.问题:

  • 给定一个整数,判断该二维数组中是否存在该整数

3.解题思路:
在这里插入图片描述
4.解题过程:

bool NiuKe::findNum(int iTarget, vector<vector<int> > vecNum)  
{
    //定义搜索元素在二维数组左下角,开始寻找
    int iColIndex = 0;  //列下标
    int iRowIndex = vecNum.size() - 1;  //行下标

    //循环条件:列与行未被搜索完成,进行循环
    while(iColIndex < vecNum.size() && iRowIndex >= 0)  
    {
        if(iTarget > vecNum[iColIndex][iRowIndex])  //目标数字 > 搜索元素
        {
            ++iColIndex;  //向存在更大值得列进行搜索
        }
        else if(iTarget < vecNum[iColIndex][iRowIndex])  //目标数字 < 搜索元素
        {
            --iRowIndex;  //向存在更小值的行进行搜索
        }
        else  //目标数字 == 搜索元素
        {
            return true; //已找到改整数
        }
    }

    return false;  //未找到该整数
}
int main()
{
    vector<vector<int> > vecNum = {{1, 2, 3}, {3, 4, 5}, {4, 5, 6}};

    NiuKe NiuTest;
    bool bFind = NiuTest.findNum(6, vecNum);

    cout << bFind << endl;
    return 0;
}

5.题后小结:

  • 本题可采用暴力的循环方法破解,逐个搜索,时间复杂度为O(n)。但由于题中数组给予了特殊设定,采用上述方法,进行逐行或逐列的搜索,可降低时间复杂度 (时间复杂度为 O(行 + 列))。

6.知识点延伸:

  • 常见时间复杂度:O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
  • 一般来说对于程序时间复杂度,默认计算最坏时间复杂度
  • 时间复杂度计算后,取其最高阶进行表示(执行次数(时间频度T(n) = 2n + 3 表示为 O(2n )),使用大O表示法。
名称时间复杂度例子运行时间
常数时间10O(1)
对数时间lognO(logn)
线性时间n + 10O(n)
线性对数时间nlognO(nlogn)
二次时间n2O(n2)
三次时间n3O(n3)
指数时间2nO(2n)
阶乘时间n!O(n!)
指数时间nnO(nn)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值