• 面试必考精华版Leetcode215. 数组中的第K个最大元素


    题目:


    代码(2023年10月27日首刷看解析):

    1. class Solution {
    2. public:
    3. int findKthLargest(vector<int>& nums, int k) {
    4. return quickselect(nums,k);
    5. }
    6. int quickselect(vector<int>& nums,int k){
    7. vector<int> big,equel,small;
    8. int pivot = nums[rand()%nums.size()];
    9. for(auto num:nums){
    10. if(num>pivot){
    11. big.push_back(num);
    12. }else if(num
    13. small.push_back(num);
    14. }else{
    15. equel.push_back(num);
    16. }
    17. }
    18. if(k<=big.size()){
    19. return quickselect(big,k);
    20. }
    21. else if(nums.size()-small.size()
    22. return quickselect(small,k-(nums.size()-small.size()));
    23. }
    24. return pivot;
    25. }
    26. };

            时间复杂度为O(N)


    代码(二刷自解 超时 2024年3月9日)

    1. struct MyListNode{
    2. int val;
    3. MyListNode* prev;
    4. MyListNode* next;
    5. MyListNode(int a) : val(a), prev(nullptr), next(nullptr) {}
    6. };
    7. class myQueue{
    8. private:
    9. MyListNode* dummyHead = new MyListNode(INT_MIN);
    10. const int n;
    11. int count = 0;
    12. void push(int val, MyListNode* node) {
    13. MyListNode* newnode = new MyListNode(val);
    14. newnode->prev = node->prev;
    15. newnode->next = node;
    16. node->prev->next = newnode;
    17. node->prev = newnode;
    18. }
    19. public:
    20. myQueue(int maxnum) : n (maxnum){
    21. dummyHead->next = dummyHead;
    22. dummyHead->prev = dummyHead;
    23. }
    24. void insert(int val) {
    25. MyListNode* cur = dummyHead->next;
    26. while (val < cur->val) {
    27. cur = cur->next;
    28. }
    29. push(val, cur);
    30. count++;
    31. if (count > n) {
    32. cur = dummyHead->prev;
    33. cur->prev->next = cur->next;
    34. cur->next->prev = cur->prev;
    35. cur->prev = nullptr;
    36. cur->next =nullptr;
    37. delete cur;
    38. }
    39. }
    40. int showLast() {
    41. return dummyHead->prev->val;
    42. }
    43. };
    44. class Solution {
    45. public:
    46. int findKthLargest(vector<int>& nums, int k) {
    47. myQueue q(k);
    48. for (int i = 0; i < nums.size(); ++i) {
    49. q.insert(nums[i]);
    50. }
    51. return q.showLast();
    52. }
    53. };

    代码(二刷看解析 构建大根堆 2024年3月9日)

    1. class Solution {
    2. public:
    3. void maxHeapify(vector<int>& nums, int i, int heapSize) {
    4. int left = i * 2 + 1;
    5. int right = i * 2 + 2;
    6. int largest = i;
    7. if (left < heapSize && nums[left] > nums[largest]) {
    8. largest = left;
    9. }
    10. if (right < heapSize && nums[right] > nums[largest]) {
    11. largest = right;
    12. }
    13. if (largest != i) {
    14. swap(nums[largest], nums[i]);
    15. maxHeapify(nums, largest, heapSize);
    16. }
    17. }
    18. void buildmaxHeap(vector<int>& nums) {
    19. int heapSize = nums.size();
    20. for (int i = heapSize / 2 - 1; i >= 0; --i) {
    21. maxHeapify(nums, i, heapSize);
    22. }
    23. }
    24. int findKthLargest(vector<int>& nums, int k) {
    25. buildmaxHeap(nums);//大根堆排序
    26. int heapSize = nums.size();
    27. //每次将最大的数和队尾的数互换,并将heapSize-1
    28. for (int i = 0; i < k - 1; ++i) {
    29. swap(nums[0], nums[heapSize - 1]);
    30. --heapSize;
    31. maxHeapify(nums, 0, heapSize);
    32. }
    33. return nums[0];
    34. }
    35. };

  • 相关阅读:
    Kotlin File.reader BufferedReader readLine
    基于PHP的高效协同办公管理系统
    优化 Vue 编译速度的方法
    QGIS编译(跨平台编译)之五十三:qgis_core库在linux QtCreator环境下编译的错误处理
    用SPDK实现存储加速
    补题记录:Codeforces Round #832 (Div. 2) D题(1747)
    从0开始学杂项 第三期:隐写分析(2) PNG图片隐写
    人工智能-卷积神经网络(LeNet)
    【jvm】虚拟机栈之操作数栈
    CDH大数据平台 Error: Package: 1:mariadb-devel-5.5.68-1.el7.x86_64 (base)
  • 原文地址:https://blog.csdn.net/qq_52313711/article/details/134070625