zoukankan      html  css  js  c++  java
  • 5403. Find the Kth Smallest Sum of a Matrix With Sorted Rows

    You are given an m * n matrix, mat, and an integer k, which has its rows sorted in non-decreasing order.

    You are allowed to choose exactly 1 element from each row to form an array. Return the Kth smallest array sum among all possible arrays.

    Example 1:

    Input: mat = [[1,3,11],[2,4,6]], k = 5
    Output: 7
    Explanation: Choosing one element from each row, the first k smallest sum are:
    [1,2], [1,4], [3,2], [3,4], [1,6]. Where the 5th sum is 7.  

    Example 2:

    Input: mat = [[1,3,11],[2,4,6]], k = 9
    Output: 17
    

    Example 3:

    Input: mat = [[1,10,10],[1,4,5],[2,3,6]], k = 7
    Output: 9
    Explanation: Choosing one element from each row, the first k smallest sum are:
    [1,1,2], [1,1,3], [1,4,2], [1,4,3], [1,1,6], [1,5,2], [1,5,3]. Where the 7th sum is 9.  
    

    Example 4:

    Input: mat = [[1,1,10],[2,2,9]], k = 7
    Output: 12
    

    Constraints:

    • m == mat.length
    • n == mat.length[i]
    • 1 <= m, n <= 40
    • 1 <= k <= min(200, n ^ m)
    • 1 <= mat[i][j] <= 5000
    • mat[i] is a non decreasing array.

    题意:

      给出一个二维数组,数组的每一行按照非减的顺序进行排列,在每一行中选出一个数字,求出所选数字的和,将这些数字排序,并求出第k小的那个。

    思路:

      本来想的是用DFS进行求解,如果这样做的话,最欢情况下的时间复杂度会是O(40^40),用DFS遍历求解的话,有可能会出现后面出现的数字比前面出现数字要小的情况,好像没办法剪枝,这种方法行不通。换种思路,我们可以用相邻两行进行相加,求得的和进行排序,截取前面的k个数字。然后再将所求的和与下一行元素相加。

    Code:

     1 class Solution {
     2 public:
     3     int kthSmallest(vector<vector<int>>& mat, int k) {
     4         vector<int> ans = {0}, temp; 
     5         for (int i = 0; i < mat.size(); ++i) {
     6             for (int j = 0; j < mat[i].size(); ++j) {
     7                 for (int v = 0; v < ans.size(); ++v) {
     8                     temp.push_back(mat[i][j] + ans[v]);
     9                 }
    10             }
    11             sort(temp.begin(), temp.end());
    12             ans.clear();
    13             int len = min(k, (int)temp.size());
    14             for (int j = 0; j < len; ++j) {
    15                 ans.push_back(temp[j]);
    16             }
    17             temp.clear();
    18         }
    19         return ans[k-1];
    20     }
    21 };

    参考:

      https://leetcode.com/problems/find-the-kth-smallest-sum-of-a-matrix-with-sorted-rows/discuss/609707/c%2B%2B-solution-with-explanation

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    COGS 577 蝗灾 线段树+CDQ分治
    BZOJ 1305 二分+网络流
    BZOJ 1066 Dinic
    BZOJ 3544 treap (set)
    BZOJ 3940 AC自动机
    BZOJ 1503 treap
    BZOJ 3172 AC自动机
    BZOJ 2553 AC自动机+矩阵快速幂 (神题)
    BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)
    BZOJ 3196 线段树套平衡树
  • 原文地址:https://www.cnblogs.com/h-hkai/p/12822640.html
Copyright © 2011-2022 走看看