# [LeetCode] 378. Report on the end of the K-th small element in the ordered matrix (C + +)

Title Description:

Given an n x n matrix, the elements of each row and column are sorted in ascending order, and the k-th smallest element in the matrix is found.
Note that it is the k-th small element after sorting, not the k-th element.

Example:

matrix = [
[ 1,  5,  9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,

Explanation:
You can assume that the value of k is always valid, 1 ≤ k ≤ n2.

Solution:

General convenience search, each cycle, to find the current minimum value. The idea is relatively direct, the time complexity is not low, and binary search is not used.

Code:

```class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int rowSize = matrix.size();
if (rowSize == 0){
return 0;
}
int colSize = matrix.size();
if (colSize == 0){
return 0;
}

int result;//Storage results
vector<int> rowPtr(rowSize, 0);//Row pointer of row I represented by rowPtr[i]n, pointing to column subscript of row I
while (k > 0){
int tempRes = INT_MAX, minIndex;//Used to record the current smallest element
//Scan all line pointers, determine the current minimum value, and mark other lines
for (int row = 0; row < rowSize; ++row){
//Rowptr [row] < colsize cannot be out of the range
if (rowPtr[row] < colSize && matrix[row][rowPtr[row]] < tempRes){
tempRes = matrix[row][rowPtr[row]];//Update current minimum
minIndex = row;//Mark the line of the minimum value
}
}
result = tempRes;//Update results
rowPtr[minIndex] += 1;//The row pointer of the currently found minimum value moves backward
k -= 1;
}
return result;
}
};```

The best solution uses binary search:

```static int x = []() {
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int n=matrix.size();
int begin=matrix,end=matrix[n-1][n-1];
while(begin<end)
{
int mid=begin+(end-begin)/2;
int pos=0;
for(int i=0;i<n;i++)
{
pos+=upper_bound(matrix[i].begin(),matrix[i].end(),mid)-matrix[i].begin();
}
if(pos<k)
begin=mid+1;
else
end=mid;
}
return end;
}
};```

Tags: iOS

Posted on Tue, 03 Dec 2019 03:37:44 -0500 by ArizonaJohn