ソートマトリックス中leetcode 378 K番目の最小の要素

バイナリ検索

間隔の長さ[MN、MX]
とO(n)の計算<=各中間の数
と比較K

class Solution {
public:
    int kthSmallest(vector<vector<int>>& v, int k) {
        int len = v.size();
        if(k <= 0 || len*len < k || len == 0)
            return -1;
        int mx = INT_MIN, mn = INT_MAX;
        for(auto vv : v) {
            for(auto vvv : vv) {
                mx = max(mx, vvv);
                mn = min(mn, vvv);
            }
        }
        int ans = -1;
        int l = mn, r = mx;
        while(l <= r) {
            int m = l + (r-l)/2;
            if(count(v, m) >= k)
                ans = m, r = m-1;
            else 
                l = m+1;
        }
        return ans;
    }
    
    int count(vector<vector<int>>& v, int m) {
        int len = v.size();
        int i = len-1, j = 0;
        int tot = 0;
        while(i >=0 && j < len) {
            if(v[i][j] > m)
                i--;
            else {
                tot += i + 1;
                j++;
            }
        }
        return tot;
    }
};

ヒープ

ヒープを確立し、それがしたい...最後の回のKポップをポップしていき
言葉遣いCMPに注意を払います

class Solution {
public:
    struct cmp{
        bool operator() (const pair<int,pair<int,int>> &a, 
                         const pair<int,pair<int,int>> &b) {
            return a.first > b.first;
        }
    };
    
    int kthSmallest(vector<vector<int>>& v, int k) {
        int len = v.size(); 
        if(len == 0 || k <= 0 || len*len <k)
            return -1;
        priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,
            cmp> que;
        for(int i=0; i<len; i++) {
            que.push({v[i][0], {i,0}});
        }
        int x = k, ans = -1;
        while(x --) {
            ans = que.top().first;
            int i = que.top().second.first;
            int j = que.top().second.second;
            que.pop();
            if(j != len-1)
                que.push({v[i][j+1], {i,j+1}});
        }
        return ans;
    }
};

おすすめ

転載: www.cnblogs.com/Draymonder/p/10990526.html