c++实现二维数组中的查找+二维数组作为函数参数的方法

题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
分析:假设我们有一个二维数组,想要在数组中找7这个元素,那么整个过程如下图所示:

  1. 假设我们有 如下一个二维数组:

在这里插入图片描述
2.我们在这个二维数组中查找7这个元素,首先从右上角开始找,显然,右上角的9是大于7的,那么就说明9这一列肯定就都是大于7的,我们就可以把这一列去除掉:
在这里插入图片描述
3.再比较剩下的,找右上角的元素8,显然8也是大于7的,所以把8所在的列去除掉:
在这里插入图片描述
4.比较余下的数组,从右上角开始,剩余的是2,显然2比7小,那么2所在行余下的元素肯定都要小于7,所以我们把2所在行剔除掉:
在这里插入图片描述
5.再看余下的数组,右上角是4,显然4比7小,剔除掉4所在行:
在这里插入图片描述
6.这时我们同样看右上角,发现刚好是想要找的元素,则完成整个过程。
在这里插入图片描述

我们将上述过程编写成为c++代码如下:

#include<iostream>
using namespace std;
bool Find(int* matrix, int rows, int columns, int number){
    bool found = false;
    if(matrix != nullptr && rows > 0 && columns > 0){
        int row = 0;
        int column = columns - 1;
        while(row < rows && column >=0){
            if(matrix[row * columns + column] == number){
                found = true;
                break;
            }
            else if(matrix[row * columns + column] > number)
                -- column;
            else
                ++ row;
        }
    }
    return found;
}
int main(){
    int arr[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
    cout<<Find(*arr,4,4,7);
    return 0;
}

在这里对二维数组作为函数参数的寻址方式做一个说明(因为我当时看到这个寻址方式的时候有一点蒙,所以在这里做一个总结)
二维数组在内存中占据连续的空间,在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储,因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应元素。
比如说上述二维数组中第二行9的位置相对于首地址就是
1x4+2=6
1:代表9这个元素所在的行
4:代表这个二维矩阵一共的列数
1x4:代表在9这个元素行之前有多少个元素
2:代表9这个元素所在的列数
整个式子就代表了9这个元素的偏移量,也就是他距离首地址之间有多少的元素。

猜你喜欢

转载自blog.csdn.net/fightingPPX/article/details/83340523