2024年最全【LeetCode刷题日记】堆类题目常见题型_堆的常见题型,Golang自定义view面试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    if (l < heapSize && a[l] > a[largest]) {
        largest = l;
    } 
    if (r < heapSize && a[r] > a[largest]) {
        largest = r;
    }
    if (largest != i) {
        swap(a[i], a[largest]);
        maxHeapify(a, largest, heapSize);
    }
}

void buildMaxHeap(vector<int>& a, int heapSize) {
    for (int i = heapSize / 2; i >= 0; --i) {
        maxHeapify(a, i, heapSize);
    } 
}

int findKthLargest(vector<int>& nums, int k) {
    int heapSize = nums.size();
    buildMaxHeap(nums, heapSize);
    for (int i = nums.size() - 1; i >= nums.size() - k + 1; --i) {
        swap(nums[0], nums[i]);
        --heapSize;
        maxHeapify(nums, 0, heapSize);
    }
    return nums[0];
}

};


### 剑指 Offer 40. 最小的k个数


![在这里插入图片描述](https://img-blog.csdnimg.cn/397dc5fd1b99462abed346d8c8a47d24.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/536ae97c6c7c47d6a5db2044a8c0f848.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/a3b42b668eb74060b28bfc531bc22950.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/88e5e6cb50954801ac3e42c942602de7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)



class Solution {
int partition(vector& nums, int l, int r) {
int 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;
}

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

void randomized\_selected(vector<int>& 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:
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;

img
img
img

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

eturn vec;

[外链图片转存中…(img-AlXddCEZ-1715722634034)]
[外链图片转存中…(img-6c4HOhuH-1715722634035)]
[外链图片转存中…(img-BfaTXJWX-1715722634035)]

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值