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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 378. 有序矩阵中第K小的元素(二分查找)

發布時間:2024/7/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 378. 有序矩阵中第K小的元素(二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 暴力法
      • 2.2 二分查找

1. 題目

給定一個 n x n 矩陣,其中每行和每列元素均按升序排序,找到矩陣中第k小的元素。
請注意,它是排序后的第k小元素,而不是第k個元素。

示例: matrix = [[ 1, 5, 9],[10, 11, 13],[12, 13, 15] ], k = 8,返回 13。 說明: 你可以假設 k 的值永遠是有效的, 1 ≤ k ≤ n^2 。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 暴力法

  • 將所有元素插入小頂堆
  • 然后出隊k-1個,最后的堆頂就是答案,時間復雜度 O(n2)
class Solution { public:int kthSmallest(vector<vector<int>>& matrix, int k) {priority_queue<int,vector<int>,greater<int>> q;for(auto row : matrix)for(auto elem : row)q.push(elem);while(--k)q.pop();return q.top();} };

2.2 二分查找

  • 找出矩陣中最小數left,最大數right,第k小的數在left~right之間
  • mid=(left+right) / 2;在矩陣中尋找小于等于mid的元素個數count
  • 若count<k,第k小的數在右半部分且不包含mid,即left=mid+1, right=right
  • 若count>=k,第k小的數在左半部分且可能包含mid,即left=left, right=mid
  • 當left==right時,第k小的數即被找出
class Solution { public:int kthSmallest(vector<vector<int>>& m, int k) {int r = m.size(), c = m[0].size();int left = m[0][0], right = m[r-1][c-1], mid, count;while(left < right){mid = left+((right-left)>>1);count = findNotBigerThanMid(m,mid,r,c);if(count < k)left = mid+1;elseright = mid;}return left;}int findNotBigerThanMid(vector<vector<int>> &m, int &mid, int &r, int &c){int i = r-1, j = 0, count = 0;while(i >= 0 && j < c){ //在左下角從下往上找,走臺階狀路線,復雜度 O(n)//或者在右上角,一樣的道理,跟if(m[i][j] <= mid){count += i+1;j++;}elsei--;}return count;} };

上面的輔助求count函數,還可寫成

int findNotBigerThanMid(vector<vector<int>> &m, int &mid, int &r, int &c) {int i = 0, j = c-1, count = 0;while(i < r && j >= 0){if(m[i][j] <= mid){count += j+1;i++;}elsej--;}return count; }

參考 Leetcode 240 搜索二維矩陣 II

總結

以上是生活随笔為你收集整理的LeetCode 378. 有序矩阵中第K小的元素(二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

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