当前位置: 首页 > 编程笔记 >

用C ++查找带排序行的矩阵的Kth最小和

戚兴邦
2023-03-14
本文向大家介绍用C ++查找带排序行的矩阵的Kth最小和,包括了用C ++查找带排序行的矩阵的Kth最小和的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个m * n矩阵,称为mat,一个整数k,mat的行以非降序排列。我们可以从每一行中精确选择一个元素来形成一个数组。我们必须在所有可能的数组中找到第K个最小的数组和。

因此,如果输入像mat = [[1,3,11],[2,4,6]]

1
3
1
1
2
4
6

并且k = 5,则输出将为7,因为当我们从每行中选择一个元素时,前k个最小的和为[1,2],[1,4],[3,2],[3,4] ,[1,6]。第五个总和是7。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个优先级队列pq

  • 定义一个2D数组m

  • 定义一个函数update(),它将使用数组v,i,好的,用false初始化它,

  • 如果i与v的大小相同,则-

    • sum:= sum + m [j,v [j]]

    • 返回

    • 如果ok为假,则-

    • 返回

    • 对于初始化j:= 0,当j <v的大小时,更新(将j增加1),执行-

    • 定义一个数组临时并将v复制到其中

    • 在开始时将sum插入temp

    • 将温度插入pq

    • 返回

    • (将v [i]增加1)

    • 如果ok为假且v [i] <z,则-

      • 更新(v,i + 1,true)

    • 更新(v,i + 1,true)

    • 更新(v,i + 1,ok)

    • 从主要方法中执行以下操作-

    • m:+给定矩阵

    • ret:= 0

    • n:= m的行数

    • z:= m的列数

    • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

      • ret:= ret + m [i,0]

    • 定义大小为n的数组温度

    • 在开始时将ret插入temp

    • 将温度插入pq

    • 定义一组

    • 当k为非零值时,请在每次迭代中将k减1,然后执行-

      • 从pq中删除元素

      • 定义一个数组temp = pq的顶部

      • 从pq中删除元素

      • 将temp插入s

      • ret:= temp [0]

      • 从temp中删除temp的第一个元素

      • 更新(温度,0)

      • 而(不是pq为空,并且pq的顶部元素是s的成员),则执行-

    • 返回ret

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    struct Cmp{
       bool operator()(vector <int>& a, vector <int>& b) {
          return !(a[0] < b[0]);
       }
    };
    class Solution {
       public:
       priority_queue<vector<int>, vector<vector<int> >, Cmp> pq;
       vector<vector<int> > m;
       int z;
       void update(vector<int>& v, int i, bool ok = false){
          if (i == v.size()) {
             if (!ok)
             return;
             int sum = 0;
             for (int j = 0; j < v.size(); j++) {
                sum += m[j][v[j]];
             }
             vector<int> temp(v.begin(), v.end());
             temp.insert(temp.begin(), sum);
             pq.push(temp);
             return;
          }
          v[i]++;
          if (!ok && v[i] < z)
          update(v, i + 1, true);
          v[i]--;
          update(v, i + 1, ok);
       }
       int kthSmallest(vector<vector<int> >& m, int k){
          this->m = m;
          int ret = 0;
          int n = m.size();
          z = m[0].size();
          for (int i = 0; i < n; i++) {
             ret += m[i][0];
          }
          vector<int> temp(n);
          temp.insert(temp.begin(), ret);
          pq.push(temp);
          set<vector<int> > s;
          while (k--) {
             vector<int> temp = pq.top();
             pq.pop();
             s.insert(temp);
             ret = temp[0];
             temp.erase(temp.begin());
             update(temp, 0);
             while (!pq.empty() && s.count(pq.top())) {
                pq.pop();
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1,3,11},{2,4,6}};
       cout << (ob.kthSmallest(v, 5));
    }

    输入项

    {{1,3,11},{2,4,6}}

    输出结果

    7
     类似资料:
    • 这是一个面试问题。 在排序的行(但不是排序的列)和行之间没有关系的矩阵中查找第k个最小元素。(第一行和第n行之间没有关系——我们只知道每一行都是按升序排列的) 输入示例如下: 这种情况下的结果是 因为20是这个矩阵中第五小的元素。 我首先想到将所有元素添加到minHeap中,然后轮询元素,同时每次迭代从k中减去一个,直到我们得到答案。我还考虑为O(m*n)解决方案实现快速选择,尽管这些解决方案并没

    • 所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败。 问题是: 给定一个矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素。 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素。 例子: 返回: 13 我的方法是使用minHeap,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输

    • 我知道以前有人问过这个问题,但这个问题是关于我的具体代码。我试图做一个psuedo-QuickSelect算法,将k与排序矩阵子区间的中点进行比较。 我一直收到一个超时错误。 以下是矩阵: 下面是我的代码: 我将元组传递给,其中包含区间的endpoint的。因此,如果我想搜索整个矩阵,我会传递和。将查看子区间,根据endpoint的行号确定中点,计算小于中点的元素数量,将其与进行比较。如果小于小于

    • 这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?

    • 我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否

    • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准