【LeetCode刷题日记】堆类题目常见题型_堆的常见题型

    int pos = randomized\_partition(arr, l, r);
    int num = pos - l + 1;
    if (k == num) {
        return;
    } else if (k < num) {
        randomized\_selected(arr, l, pos - 1, k);
    } else {
        randomized\_selected(arr, pos + 1, r, k - num);
    }
}

public:
vector getLeastNumbers(vector& arr, int k) {
srand((unsigned)time(NULL));
randomized_selected(arr, 0, (int)arr.size() - 1, k);
vector vec;
for (int i = 0; i < k; ++i) {
vec.push_back(arr[i]);
}
return vec;
}
};


### 347. 前 K 个高频元素


![在这里插入图片描述](https://img-blog.csdnimg.cn/2374705dff454833a9713117fc113287.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/67d8bca21b264e9ba8ff37c049a45e82.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



class Solution {
public:
static bool cmp(pair<int, int>& m, pair<int, int>& n) {
return m.second > n.second;
}

vector<int> topKFrequent(vector<int>& nums, int k) {
    unordered_map<int, int> occurrences;
    for (auto& v : nums) {
        occurrences[v]++;
    }

    // pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
    priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
    for (auto& [num, count] : occurrences) {
        if (q.size() == k) {
            if (q.top().second < count) {
                q.pop();
                q.emplace(num, count);
            }
        } else {
            q.emplace(num, count);
        }
    }
    vector<int> ret;
    while (!q.empty()) {
        ret.emplace\_back(q.top().first);
        q.pop();
    }
    return ret;
}

};


![在这里插入图片描述](https://img-blog.csdnimg.cn/78225fa58ef7495dbd93dcc2325be15b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



class Solution {
public:
void qsort(vector<pair<int, int>>& v, int start, int end, vector& ret, int k) {
int picked = rand() % (end - start + 1) + start;
swap(v[picked], v[start]);

    int pivot = v[start].second;
    int index = start;
    for (int i = start + 1; i <= end; i++) {
        if (v[i].second >= pivot) {
            swap(v[index + 1], v[i]);
            index++;
        }
    }
    swap(v[start], v[index]);

    if (k <= index - start) {
        qsort(v, start, index - 1, ret, k);
    } else {
        for (int i = start; i <= index; i++) {
            ret.push\_back(v[i].first);
        }
        if (k > index - start + 1) {
            qsort(v, index + 1, end, ret, k - (index - start + 1));
        }
    }
}

vector<int> topKFrequent(vector<int>& nums, int k) {
    unordered_map<int, int> occurrences;
    for (auto& v: nums) {
        occurrences[v]++;
    }

    vector<pair<int, int>> values;
    for (auto& kv: occurrences) {
        values.push\_back(kv);
    }
    vector<int> ret;
    qsort(values, 0, values.size() - 1, ret, k);
    return ret;
}

};


### 973. 最接近原点的 K 个点


![在这里插入图片描述](https://img-blog.csdnimg.cn/4e8ecac4d1dd49528f43ef8eab92a6db.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)


![在这里插入图片描述](https://img-blog.csdnimg.cn/606cf5aa840c4785aa52ca916e4992f1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/591e8e9dc1cc4b06a83ccf19ae46fe29.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/55508a13a4244aa2bd82663843702a0c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



class Solution {
private:
mt19937 gen{random_device{}()};

public:
void random_select(vector<vector>& points, int left, int right, int k) {
int pivot_id = uniform_int_distribution{left, right}(gen);
int pivot = points[pivot_id][0] * points[pivot_id][0] + points[pivot_id][1] * points[pivot_id][1];
swap(points[right], points[pivot_id]);
int i = left - 1;
for (int j = left; j < right; ++j) {
int dist = points[j][0] * points[j][0] + points[j][1] * points[j][1];
if (dist <= pivot) {
++i;
swap(points[i], points[j]);
}
}
++i;
swap(points[i], points[right]);
// [left, i-1] 都小于等于 pivot, [i+1, right] 都大于 pivot
if (k < i - left + 1) {
random_select(points, left, i - 1, k);
}
else if (k > i - left + 1) {
random_select(points, i + 1, right, k - (i - left + 1));
}
}

vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
    int n = points.size();
    random\_select(points, 0, n - 1, k);
    return {points.begin(), points.begin() + k};
}

};


### 1337. 矩阵中战斗力最弱的 K 行


![在这里插入图片描述](https://img-blog.csdnimg.cn/b70f2bc67f40483686ae91d6f4be3b1b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/39fc706a2cba4c7b99826d8d086294a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_19,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5aabb01435da4d2b95bccb5b74986092.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



class Solution {
public:
vector kWeakestRows(vector<vector>& mat, int k) {
int m = mat.size(), n = mat[0].size();
vector<pair<int, int>> power;
for (int i = 0; i < m; ++i) {
int l = 0, r = n - 1, pos = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (mat[i][mid] == 0) {
r = mid - 1;
}
else {
pos = mid;
l = mid + 1;
}
}
power.emplace_back(pos + 1, i);
}

    priority_queue q(greater<pair<int, int>>(), move(power));
    vector<int> ans;
    for (int i = 0; i < k; ++i) {
        ans.push\_back(q.top().second);
        q.pop();
    }
    return ans;
}

};


![在这里插入图片描述](https://img-blog.csdnimg.cn/14aac306869e4bb19eb8fcaf19f6d446.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



template
class Helper {
static int partition(vector& nums, int l, int r) {
T pivot = nums[r];
int i = l - 1;
for (int j = l; j <= r - 1; ++j) {
if (nums[j] <= pivot) {
i = i + 1;
swap(nums[i], nums[j]);
}
}
swap(nums[i + 1], nums[r]);
return i + 1;
}

// 基于随机的划分
static int randomized\_partition(vector<T>& nums, int l, int r) {
    int i = rand() % (r - l + 1) + l;
    swap(nums[r], nums[i]);
    return partition(nums, l, r);
}

static void randomized\_selected(vector<T>& arr, int l, int r, int k) {
    if (l >= r) {
        return;
    }
    int pos = randomized\_partition(arr, l, r);
    int num = pos - l + 1;
    if (k == num) {
        return;
    } else if (k < num) {
        randomized\_selected(arr, l, pos - 1, k);
    } else {
        randomized\_selected(arr, pos + 1, r, k - num);
    }
}

public:
static vector getLeastNumbers(vector& arr, int k) {
srand((unsigned)time(NULL));
randomized_selected(arr, 0, (int)arr.size() - 1, k);
vector vec;
for (int i = 0; i < k; ++i) {
vec.push_back(arr[i]);
}
return vec;
}
};

class Solution {
public:
vector kWeakestRows(vector<vector>& mat, int k) {
int m = mat.size(), n = mat[0].size();
vector<pair<int, int>> power;
for (int i = 0; i < m; ++i) {
int l = 0, r = n - 1, pos = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (mat[i][mid] == 0) {
r = mid - 1;
}
else {
pos = mid;
l = mid + 1;
}
}
power.emplace_back(pos + 1, i);
}

    vector<pair<int, int>> minimum = Helper<pair<int, int>>::getLeastNumbers(power, k);
    sort(minimum.begin(), minimum.begin() + k);
    vector<int> ans;
    for (int i = 0; i < k; ++i) {
        ans.push\_back(minimum[i].second);
    }
    return ans;
}

};


### 378. 有序矩阵中第 K 小的元素


![在这里插入图片描述](https://img-blog.csdnimg.cn/0d84b294594149ab9ff1d17b9ddd5651.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0bdffed8f9934d78a671efdd6821b384.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ac022af3a017403cb0f988c447f8e337.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)


### 703. 数据流中的第 K 大元素


![在这里插入图片描述](https://img-blog.csdnimg.cn/649af987488b4bbf801c0897db09dd67.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/038a54b56b524bffac9fc93b5bce8c0d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)


### 295. 数据流的中位数


![在这里插入图片描述](https://img-blog.csdnimg.cn/4b2d360ca76447399fba0a94d61d8410.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f7358537fd7a4572aa21965dc88a87bc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



class MedianFinder {
public:
priority_queue<int, vector, less> queMin;
priority_queue<int, vector, greater> queMax;

MedianFinder() {}

void addNum(int num) {
    if (queMin.empty() || num <= queMin.top()) {

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

, greater> queMax;

MedianFinder() {}

void addNum(int num) {
    if (queMin.empty() || num <= queMin.top()) {

[外链图片转存中…(img-Smu5ITmW-1726125348343)]
[外链图片转存中…(img-mOE0U9gC-1726125348344)]
[外链图片转存中…(img-j6LgG0Up-1726125348344)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值