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

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

posted @ 2015-04-19 13:39  long#long  阅读(231)  评论(0编辑  收藏  举报