二维数组中的查找3

数组:
数组是C++中基本的数据结构,它占据一块连续的内存并且按照顺序存储数字和字符。
由于数组中的内存是连续。于是我们可以根据下标在O(1)时间读/写任何元素。根据数组时间效率的优点,用数组来实现简单的哈希表,把数组的下标记为哈希表的Key(键值),而把数组中的每个数字设为哈希表的Value(值)。
在此我们以二维数组为例,进行查找操作,熟悉数组的使用方式。
二维数组:
二维数组在内存中占据连续的空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储各列。因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应的元素。

题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面这个二维数组:(查找数字10的时候,返回true)

测试用例:

int main(){
    int matrix[4][4];
    //生成一个行及列分别递增的整数二维数组, 好的生成方法是什么???
    matrix[0][0] = 1; matrix[0][1] = 2; matrix[0][2] = 8;  matrix[0][3] = 9;
    matrix[1][0] = 2; matrix[1][1] = 4; matrix[1][2] = 9;  matrix[1][3] = 12;
    matrix[2][0] = 4; matrix[2][1] = 7; matrix[2][2] = 10; matrix[2][3] = 13;
    matrix[3][0] = 6; matrix[3][1] = 8; matrix[3][2] = 11; matrix[3][3] = 15;

    //打印出这个二维数组
    std::cout << "Matrix is:\n";
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++)
            std::cout << matrix[i][j] << "\t";
        std::cout << "\n";
    }
    //要查找的整数
    int number;
    std::cout << "Enter to find the number: ";
    std::cin >> number;
    //二维数组中是否有要查找整数
    bool result = matrixFind(matrix, 4, 4, number);
    if(result)
        std::cout << "Find it\n";
    else
        std::cout << "Not found\n";

    return 0;
}

matrixFind函数实现

//查找函数
//查找思路:自二维数组的右上角开始查找,如果所查找的数字小于右上角的数,那么最右侧一列可排除,可依此继续查找,不断缩小范围
//否则,若所查找数字大于右上角的数,必然在最右侧
bool matrixFind(int matrix[][4], int rows, int columns, int number){//以二维数组作为函数参数的传入方法
    //自右上角开始查找,使用while循环,加入数组为NULL的判断
    //查找结果初始化为失败
    bool found = false;

    //从右上角开始查找
    //右上角坐标,行、列
    int row = 0, colum = columns - 1;

    while(row < rows && colum >= 0 && matrix != NULL){
        if(matrix[row][colum] == number){
            found = true;
            break;
        }else if(matrix[row][colum] < number){
            ++row;
        }else{
            --colum;
        }
    }

    return found;
}

注意C++中二维数组作为函数参数传入的时候,必须指定二维长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值