zoukankan      html  css  js  c++  java
  • 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++;
                }
            }
        }
    };
    
  • 相关阅读:
    284. Peeking Iterator
    283. Move Zeroes
    282. Expression Add Operators
    281. Zigzag Iterator
    280. Wiggle Sort
    279. Perfect Squares
    python 正则匹配替换,在匹配的字符后方添加新的字符
    odoo default_get 方法和onchange装饰器造成冲突,
    redmine 如何启用用户图标
    odoo 打印执行的sql语句
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7354088.html
Copyright © 2011-2022 走看看