• LC1439 有序矩阵中的第 k 个最小数组和


    题目要求返回所有可能数组中的第 k 个 最小 数组和。

    根据题目给出的矩阵每行均为单调递增的提示,可以得出下一个最小数组和是由之前得到过的数组转移过来的。

    因为k的范围不大,所以可以使用优先队列+bfs思想模拟这个过程。

    备忘这里的优先队列重载方法

    class Solution {
    public:
        int kthSmallest(vector<vector<int>>& mat, int k) {
            struct node {
                vector<int> pos;
                int tot;
                node(vector<int> tmp, int t) {
                    pos = tmp, tot = t;
                }
            };
            auto my_cmp = [](const node &a, const node &b) {
                return a.tot > b.tot;
            };
            priority_queue<node, vector<node>, decltype(my_cmp)> pq(my_cmp);
    
            int M = mat.size(), N = mat[0].size();
            vector<int> tmp(M);
            set<vector<int> > s;
            int sum = 0;
            for(int i = 0; i < M; i++) {
                tmp[i] = 0, sum += mat[i][0];
            }
            pq.push({tmp, sum});
            while(!pq.empty()) {
                tmp = pq.top().pos, sum = pq.top().tot;
                pq.pop();
                k--;
                /*printf("%d
    ", sum);
                for(int i = 0; i < M; i++)
                    printf("%d ", tmp[i]);
                puts("");*/
                if(k == 0) break;
                for(int i = 0; i < M; i++) {
                    if(tmp[i]+1 < N) {
                        tmp[i]++;
                        if(s.count(tmp) == 0) {
                            s.insert(tmp);
                            pq.push({tmp, sum+mat[i][tmp[i]]-mat[i][tmp[i]-1]});
                        }
                        tmp[i]--;
                    }
                }
            }
            return sum;
        }
    };
    View Code
  • 相关阅读:
    VS.NET的新用途
    ASP.NET缓存引起的问题
    增加了查看最新回复功能
    高级浏览功能可以使用了
    转载JGTM'2004 [MVP]的文章
    首页文章字数统计改进
    请推荐好的工作流产品
    不错的工具:Reflector for .NET
    寻找文件同步软件
    javascript引起博客园首页不能显示问题说明
  • 原文地址:https://www.cnblogs.com/canchan/p/12911725.html
Copyright © 2020-2023  润新知