zoukankan      html  css  js  c++  java
  • 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] << '	';
                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名企面试官精讲典型编程题》

  • 相关阅读:
    Go panic+defer+recover理解加使用
    golang atomic包的使用
    Mongo 锁的理解
    AudioManager(录音)
    SAXpraseHelper
    Density
    CustomDialog
    CustomScrollVeiw(双向滑动)
    tf的concat问题
    tensorflow的gpu版本错误
  • 原文地址:https://www.cnblogs.com/RDaneelOlivaw/p/7358102.html
Copyright © 2011-2022 走看看