日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix

發(fā)布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題簡述

給定一個 n×n 的矩陣,矩陣中每行和每列的元素都按升序排列。給定一個 k(k[1,n2]), 求再整個矩陣中按從小到大排序為 k 的元素。
例如:

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

解題思路

該矩陣的行和列都是按從小到大的順序排列的,這樣的問題一般都是可以用二分法解決的。再來看,我們的輸入 k,輸出是第 k 大的元素,不難發(fā)現(xiàn),k 越大,輸出的元素也就越大。好了,決定用二分法了~
首先,我們以整個矩陣中的最小值為下邊界(左上角元素),最大值為上邊界(右下角元素)。然后用二分的方法猜過去,猜輸出的結果是多少。只要滿足猜的條件,我們就會把整個元素記錄下來,然后看看有沒有比這個元素小,并且滿足猜的條件的元素。這個過程的時間復雜度為 O(?log(maxVal?minVal)?),其中的 minVal 為矩陣左上角的元素,maxVal 為矩陣右下角的元素。
好了,接下來就是看看怎么猜了~
這里猜的時候又用到了一次二分法,其目的是找到每行中不大于猜的值 val 的數(shù)有多少,然后算出整個矩陣中不大于 val 的數(shù)有多少。如果不大于 val 的數(shù)大于 k 則返回true,否則返回false。這個過程的時間復雜度為 O( nlog(n) )。這一步是可以進一步優(yōu)化的~
這個過程的時間復雜度為 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。