利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix
問題簡述
給定一個 n×n 的矩陣,矩陣中每行和每列的元素都按升序排列。給定一個 k(k∈[1,n2]), 求再整個矩陣中按從小到大排序為 k 的元素。
例如:
解題思路
該矩陣的行和列都是按從小到大的順序排列的,這樣的問題一般都是可以用二分法解決的。再來看,我們的輸入 k,輸出是第 k 大的元素,不難發現,k 越大,輸出的元素也就越大。好了,決定用二分法了~
首先,我們以整個矩陣中的最小值為下邊界(左上角元素),最大值為上邊界(右下角元素)。然后用二分的方法猜過去,猜輸出的結果是多少。只要滿足猜的條件,我們就會把整個元素記錄下來,然后看看有沒有比這個元素小,并且滿足猜的條件的元素。這個過程的時間復雜度為 O(?log(maxVal?minVal)?),其中的 minVal 為矩陣左上角的元素,maxVal 為矩陣右下角的元素。
好了,接下來就是看看怎么猜了~
這里猜的時候又用到了一次二分法,其目的是找到每行中不大于猜的值 val 的數有多少,然后算出整個矩陣中不大于 val 的數有多少。如果不大于 val 的數大于 k 則返回true,否則返回false。這個過程的時間復雜度為 O( nlog(n) )。這一步是可以進一步優化的~
這個過程的時間復雜度為 O(?nlog(n)log(maxVal?minVal)?)。
最后,上代碼~
代碼
class Solution { private:bool guess(vector<vector<int>>& matrix, int k, int val){for (int i = 0; i < matrix.size(); i++){int left = 0;int right = matrix[i].size() - 1;int ans = 0;while (left <= right){int mid = left + (right - left) / 2;if (matrix[i][mid] <= val){left = mid + 1;ans = mid + 1;}else{right = mid - 1;}}k -= ans;if (k < 1)return true;}return false;}public:int kthSmallest(vector<vector<int>>& matrix, int k) {int n = matrix.size();int left = matrix[0][0];int right = matrix[n - 1][n - 1];int ans;while (left <= right){int mid = left + (right - left) / 2;if (guess(matrix, k, mid)){ans = mid;right = mid - 1;}else{left = mid + 1;}}return ans;} };總結
以上是生活随笔為你收集整理的利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 2139. 得到目标值
- 下一篇: LeetCode 1833. 雪糕的最大