zoukankan      html  css  js  c++  java
  • {面试题3: 二维数组中的查找 }

    From 剑指Offer 何海涛 著

    // 从右上角开始查找
    bool find(const int *matrix, int rows, int columns, int value) {
        if(matrix == NULL || rows <= 0 || columns <= 0 ||  value < *matrix || *(matrix+rows*columns-1) < value) {
            return false;
        }
        int row = 0;
        int column = columns-1;
        while(row < rows && column >= 0) {
            int curr = *(matrix+row*columns+column);
            if(curr == value) {
                return true;
            }
            if(curr < value) {
                row++;
            } else {
                column--;
            }
        }
        
        return false;
    }
    // 从左下角开始查找
    bool
    find(const int *matrix, int rows, int columns, int value) { bool found = false; if(matrix != NULL && rows > 0 && columns > 0 && *matrix <= value && value <= *(matrix+rows*columns-1)) { int row = rows-1; int column = 0; while(row >=0 && column < columns) { int curr = *(matrix+row*columns+column); if(curr == value) { found = true; break; } if(curr < value) { column++; } else { row--; } } } return found; }

    测试集:

    void test(const int *matrix, int rows, int columns, int value, bool expected) {
        std::cout << std::boolalpha << (find(matrix, rows, columns, value) == expected) << std::endl;
    }
    
    int main(int argc, char* argv[]) {
        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
        
        test(NULL,    4, 4, 7, false);
        test(*matrix, 0, 4, 7, false);
        test(*matrix, 2, 4, 7, false);
        
        test(*matrix, 4, 4, 7, true);
        test(*matrix, 4, 4, 5, false);
        test(*matrix, 4, 4, 1, true);
        test(*matrix, 4, 4, 15, true);
        test(*matrix, 4, 4, 0, false);
        test(*matrix, 4, 4, 16, false);
        
        return 0;
    }

    注意: 列数必须是原矩阵的列数, 否则将破坏原矩阵中元素出现的规律: 同一行上元素呈递增趋势; 同一列上元素呈递增趋势!

  • 相关阅读:
    递归与分治4
    递归与分治3
    递归与分治2
    递归与分治1
    枚举与递推3
    枚举与递推2
    求编译器中数的最值(c++)
    移动小球链表实现
    阶乘的精确值
    while((c = getchar()) != EOF)(键盘输入问题)
  • 原文地址:https://www.cnblogs.com/long3216/p/4439031.html
Copyright © 2011-2022 走看看