lintcode-401-排序矩阵中的从小到大第k个数

401-排序矩阵中的从小到大第k个数

在一个排序矩阵中找从小到大的第 k 个整数。
排序矩阵的定义为:每一行递增,每一列也递增。

样例

给出 k = 4 和一个排序矩阵:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
返回 5。

挑战

使用O(k log n)的方法,n为矩阵的宽度和高度中的最大值。

标签

堆 优先队列 矩阵

思路

利用类似于小顶堆的方法,将排序矩阵 matrix 化为小顶堆,即 matrix[0][0] 为矩阵中最小元素,且矩阵每一行递增,每一列也递增,在取出堆顶元素后,将堆顶元素化为最大值 INT_MAX,然后调整矩阵,使其符合小顶堆定义。如此一来,取出的第 k 个元素即排序矩阵中的从小到大第k个数

code

class Solution {
public:
    /**
     * @param matrix: a matrix of integers
     * @param k: an integer
     * @return: the kth smallest number in the matrix
     */
    int kthSmallest(vector<vector<int> > &matrix, int k) {
        // write your code here
        int sizeRow = matrix.size();
        if (sizeRow <= 0) {
            return 0;
        }
        int sizeCol = matrix[0].size();
        if (sizeCol <= 0) {
            return 0;
        }
        
        int min = 0;

        for (int i = 0; i < k; i++) {
            min = matrix[0][0];
            matrix[0][0] = INT_MAX;
            adjustMatrix(matrix);
        }
        return min;
    }

    void adjustMatrix(vector<vector<int> > &matrix) {
        int row = 0, col = 0;
        while (row < matrix.size() - 1 && col < matrix[0].size() - 1) {
            if (matrix[row][col + 1] <= matrix[row + 1][col]) {
                swap(matrix[row][col + 1], matrix[row][col]);
                col++;
            }
            else if (matrix[row][col + 1] >= matrix[row + 1][col]) {
                swap(matrix[row + 1][col], matrix[row][col]);
                row++;
            }
        }
        while (row == matrix.size() - 1 && col < matrix[0].size() - 1) {
            if (matrix[row][col] >= matrix[row][col + 1]) {
                swap(matrix[row][col + 1], matrix[row][col]);
                col++;
            }
        }
        while (col == matrix[0].size() - 1 && row < matrix.size() - 1) {
            if (matrix[row][col] >= matrix[row + 1][col]) {
                swap(matrix[row + 1][col], matrix[row][col]);
                row++;
            }
        }
    }
};
posted @ 2017-08-13 17:30  LiBaoquan  阅读(748)  评论(0编辑  收藏  举报