C++二维数组查找题

题目:在一个二维数组中,每一行都按照从左到右递增的顺序,每一列都按照从上到下递增的顺序排序,完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该函数。

如二维数组:

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

查找数字7,存在返回true;查找数字5,不存在,返回false;

处理方法:

从最右上角的数字开始,如果查找数小于该数,则查找数一定位于该数左侧,排除该列,继续查找左侧剩下的矩阵;

如果查找数大于该数,则查找数一定位于该数下侧,排除该行,继续查找下侧剩下的矩阵,以此类推继续从剩下矩阵的右上角数字开始查找;

如果查找数字等于该数,则返回true;

如果已无矩阵剩下且仍未找到,则返回false。

代码:

bool Find(int *matrix, int rows, int columns, int number) {
    bool found = false;
    int row = 0, column = columns-1;
    if (matrix != NULL && rows > 0 &&columns >0) {
        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;
}

完整测试代码:

#include <iostream>
#include <stdio.h>
using namespace std;

bool Find(int *matrix, int rows, int columns, int number) {
    bool found = false;
    int row = 0, column = columns-1;
    if (matrix != NULL && rows > 0 &&columns >0) {
        while(row < rows && column >=0) {
            if(matrix[row*columns+column] == number) {
                found = true;
                break;
            } else if (matrix[row*columns+column] > number) {
                --column;
            } else {
                ++row;
            }
        }
    }
    if(found)
        cout << "The number found in row: " << row+1 <<", column: " << column+1 << ‘.‘ << endl;
    else
        cout << "The number is not found." << endl;
    cout << "------------------------------" << endl;
    return found;
}

void Test(int* matrix, int rows, int columns, int number) {
    cout << "-------The input matrix is: ------" << endl;
    for(int r = 0; r< rows; r++) {
        for(int c = 0; c < columns; c++) {
            if(r==rows)
                break;
            cout << matrix[r*columns+c] << ‘\t‘;
            if(c==columns-1) {
                c = -1;
                ++r;
                cout << endl;
            }
        }
    }
    cout << endl << "The number to find: " << number << ‘.‘ << endl;
    Find(matrix, rows, columns, number);
}

int main() {
    int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
    Test((int*)matrix, 4, 4, 7);
    Test((int*)matrix, 4, 4, 5);
    Test((int*)matrix, 4, 4, 1);
    Test((int*)matrix, 4, 4, 15);
    Test((int*)matrix, 4, 4, 0);
    Test((int*)matrix, 4, 4, 16);
    Test((int*)matrix, 0, 0, 16);
    return 0;

}

参考资料:《剑指offer名企面试官精讲典型编程题》

时间: 2024-08-13 13:06:42

C++二维数组查找题的相关文章

php利用array_search与array_column实现二维数组查找

在看php手册数组函数时,看到了一个高赞的用户回答传送门,利用array_search与array_column实现二维数组查找,不用自己写个循环,减少工作量. <?php $userdb = array( 0 => array( 'uid' => 100, 'name' => 'Sandra Shush', 'url' => 'urlof100' ), 1 => array( 'uid' => 5465, 'name' => 'Stefanie Mcmoh

offer 二维数组查找

二维数组查找: (1)C语言实现方式: 测试用例:int AA[16]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15}; bool Find1(int * target, int rows,int colums,int number) //输入的行数和列数 { int row=0, colum=colums-1; //实时变化的 /下标 if (target==NULL||rows<=0||colums<=0)//保持 { return false; } whil

《剑指Offer》算法题——二维数组查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Solution { public: bool Find(vector<vector<int> > array, int target) { int col = array.size(); int i = 0; while (i < col) { int j = array[i].size()

二维数组查找

问题描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 特点:如下图,基本上是一个m*n的矩阵,排列顺序如题目描述的一样 思路:从右上角的数开始查找,对于右上角的数来说,他的左侧的数比自己小,下方的数比自己大,如图:将待查找的数据与右上方的数比较时,如果比9小,查再查找9左边的数,如果比9大,则继续查找9下方的数,依次继续比较,知道找到或者x>=矩阵行数或者y<0,换句话说

二维数组查找元素

简介 数组是一种比较简单的数据结构,它占据一块连续的内存并按照顺序存储数据.在创建时,需要先指定数组的容量大小,然后根据大小分配内存.因此数组的空间效率不是很好,经常会有空闲的区域没有充分利用.由于数组内存是连续的,所以可以用下标访问元素,时间效率比较高. 题目 在一个二维数组中,每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排列,完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数 1 2 8  9 2 4 9  12 4 7 10 13 6 8 11

行列有序的二维数组查找

描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入描述: array: 待查找的二维数组 target:查找的数字 输出描述: 查找到返回true,查找不到返回false 解析 分冶法 这种行和列分别递增的矩阵,有一个专有名词叫做杨氏矩阵,由剑桥大学数学家杨表在1900年推提出,在这个矩阵中的查找,俗称杨氏矩阵查找.以查找数字6为例,因为矩阵的行和列都是递增的,所以整

剑指offer----1.二维数组查找

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:从左下角元素往上查找,右边元素是比这个元素大,上边是的元素比这个元素小.于是,target比这个元素小就往上找,比这个元素大就往右找.如果出了边界,则说明二维数组中不存在target元素. 答案: class Solution { public: bool Find(int target, v

处理二维数组两题

问题一:旋转一个图像,向右旋转90度 一种思路就是将元素一个一个往右移动,准确计算出位置即可. //题目6 翻转图像 public void rotate(int [][] matrix,int n){ for(int layer=0;layer<n/2;layer++){ int start=layer; int end=n-1-layer; for(int i=start;i<end;i++){ int offset=i-start; int top=matrix[start][i]; m

二维数组查找——剑指offer

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数. 1 #include <stdio.h> 2 #include<stdbool.h> 3 int main() 4 { 5 int find(int matrix[4][4], int rows, int columns, int number); 6 int a[4][4] = {{ 1, 2, 8, 9 },