Kth smallest element in a row-column wise sorted matrix in C++
Kth smallest element in a row-column wise sorted matrix in C++
Here, in this page we will discuss the program to find Kth smallest element in a row-column wise sorted matrix in C++ programming language. We will discuss different approaches in this page.
Method Discussed :
- Method 1 : Without finding GCD.
- Method 2 : Using GCD approach.
- Method 3 : Recursive approach
Let’s discuss above three methods in brief,
Method 1 :
Store the three elements in the array.
- Set result = 1
- Find a common factors of two or more array elements.
- Multiply the result by common factor and divide all the array elements by this common factor.
- Repeat steps 2 and 3 while there is a common factor of two or more elements.
- Multiply the result by reduced (or divided) array elements.
Method 1 : Code in C++
Run
#include <bits/stdc++.h>
using namespace std;
struct HeapNode {
int val;
int r;
int c;
};
void minHeapify(HeapNode harr[], int i, int heap_size)
{
int l = i * 2 + 1;
int r = i * 2 + 2;
if(l < heap_size&& r<heap_size && harr[l].val < harr[i].val && harr[r].val < harr[i].val){
HeapNode temp=harr[r];
harr[r]=harr[i];
harr[i]=harr[l];
harr[l]=temp;
minHeapify(harr ,l,heap_size);
minHeapify(harr ,r,heap_size);
}
if (l < heap_size && harr[l].val < harr[i].val){
HeapNode temp=harr[i];
harr[i]=harr[l];
harr[l]=temp;
minHeapify(harr ,l,heap_size);
}
}
int kthSmallest(int mat[4][4], int n, int k)
{
if (k < 0 || k >= n * n)
return INT_MAX;
HeapNode harr[n];
for (int i = 0; i < n; i++)
harr[i] = { mat[0][i], 0, i };
HeapNode hr;
for (int i = 0; i < k; i++) {
hr = harr[0];
int nextval = (hr.r < (n - 1)) ? mat[hr.r + 1][hr.c]: INT_MAX;
harr[0] = { nextval, (hr.r) + 1, hr.c };
minHeapify(harr, 0, n);
}
return hr.val;
}
int main()
{
int mat[4][4] = {
{ 10, 20, 30, 40 },
{ 15, 25, 35, 45 },
{ 25, 29, 37, 48 },
{ 32, 33, 39, 50 },
};
cout << "6th smallest element is "<< kthSmallest(mat, 4, 6);
return 0;
}
Output
6th smallest element is 29
Method 2 :
By using a comparator, we can carry out custom comparison in priority_queue. We will use priority_queue<pair<int,int>> for this.
Method 2 : Code in C++
Run
#include<bits/stdc++.h>
using namespace std;
int kthSmallest(int mat[4][4], int n, int k)
{
auto cmp = [&](pair<int,int> a,pair<int,int> b){
return mat[a.first][a.second] > mat[b.first][b.second];
};
priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(cmp)> pq(cmp);
for(int i=0; i<n; i++){
pq.push({i,0});
}
for(int i=1; i<k; i++){
auto p = pq.top();
pq.pop();
if(p.second+1 < n) pq.push({p.first,p.second + 1});
}
return mat[pq.top().first][pq.top().second];
}
int main()
{
int mat[4][4] = {
{ 10, 20, 30, 40 },
{ 15, 25, 35, 45 },
{ 25, 29, 37, 48 },
{ 32, 33, 39, 50 },
};
cout << "6th smallest element is " << kthSmallest(mat, 4, 6);
return 0;
}
Output
6th smallest element is 29
Login/Signup to comment

#code in python
def find(arr,k):
s=arr[-1][-1]
p=0
n=0
while np and j<temp:
temp=j
p=temp
n+=1
print(p)
arr=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
find(arr,5)