• {面试题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;
    }

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

  • 相关阅读:
    大型网站随着业务的增长架构演进
    springboot日志logback配置
    一些容易出错的细节
    从一个下载优化说起
    徒手优化冒泡排序
    php设计模式之观察者模式
    php设计模式之抽象工厂模式
    phper談談最近重構代碼的感受(3)
    php设计模式----工厂模式
    偏执的我从Linux到Windows的感受
  • 原文地址:https://www.cnblogs.com/long3216/p/4439031.html
Copyright © 2020-2023  润新知