
- C++ Basics
- C++ Home
- C++ Overview
- C++ Environment Setup
- C++ Basic Syntax
- C++ Comments
- C++ Data Types
- C++ Variable Types
- C++ Variable Scope
- C++ Constants/Literals
- C++ Modifier Types
- C++ Storage Classes
- C++ Operators
- C++ Loop Types
- C++ Decision Making
- C++ Functions
- C++ Numbers
- C++ Arrays
- C++ Strings
- C++ Pointers
- C++ References
- C++ Date & Time
- C++ Basic Input/Output
- C++ Data Structures
- C++ Object Oriented
- C++ Classes & Objects
- C++ Inheritance
- C++ Overloading
- C++ Polymorphism
- C++ Abstraction
- C++ Encapsulation
- C++ Interfaces
Find the Kth Smallest Sum of a Matrix With Sorted Rows in C++
Suppose we have one m * n matrix called mat, and an integer k, mat has its rows sorted in nondecreasing order. We can choose exactly one element from each row to form an array. We have to find the Kth smallest array sum among all possible arrays.
So, if the input is like mat = [[1,3,11],[2,4,6]]
1 | 3 | 1 1 |
2 | 4 | 6 |
and k = 5, then the output will be 7, as when we choose one element from each row the first k smallest sums are [1,2], [1,4], [3,2], [3,4], [1,6]. here the 5th sum is 7.
To solve this, we will follow these steps −
Define one priority queue pq
Define one 2D array m
Define a function update(), this will take an array v, i, ok initialize it with false,
if i is same as size of v, then −
if ok is false, then −
return
return
for initialize j := 0, when j < size of v, update (increase j by 1), do −
sum := sum + m[j, v[j]]
Define an array temp and copy v into it
insert sum into temp at the beginning
insert temp into pq
return
(increase v[i] by 1)
if ok is false and v[i] < z, then −
update(v, i + 1, true)
update(v, i + 1, true)
update(v, i + 1, ok)
From the main method do the following −
m :+ given matrix
ret := 0
n := row count of m
z := column count of m
for initialize i := 0, when i < n, update (increase i by 1), do −
ret := ret + m[i, 0]
Define an array temp of size n
insert ret into temp at the beginning
insert temp into pq
Define one set s
while k is non-zero, decrease k by 1 in each iteration, do −
Define an array temp = top of pq
delete element from pq
insert temp into s
ret := temp[0]
delete first element of temp from temp
update(temp, 0)
while (not pq is empty and top element of pq is member of s), do −
delete element from pq
return ret
Let us see the following implementation to get better understanding −
Example
#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)); }
Input
{{1,3,11},{2,4,6}}
Output
7
- Related Articles
- Kth Smallest Element in a Sorted Matrix in Python
- Find Number of Sorted Rows in a Matrix in Java?
- Count all sorted rows in a matrix in C++
- Find a common element in all rows of a given row-wise sorted matrix in C++
- How to find the sum of rows, columns, and total in a matrix in R?
- Program to find kth smallest n length lexicographically smallest string in python
- How to find the sum of rows and columns of a given matrix using Numpy?
- Kth Smallest Element in a BST in Python
- Program to find the kth smallest element in a Binary Search Tree in Python
- Program to find kth smallest element in linear time in Python
- Find the Pair with Given Sum in a Matrix using C++
- Program to find matrix for which rows and columns holding sum of behind rows and columns in Python
- Find sub-matrix with the given sum in C++
- Swift Program to calculate the sum of rows of matrix elements
- Golang Program to calculate the sum of rows of matrix elements
