• 215. 数组中的第K个最大元素(快排,堆排序)


     

    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

    示例 1:

    输入: [3,2,1,5,6,4] 和 k = 2
    输出: 5
    

    示例 2:

    输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
    输出: 4
    class Solution {
    public:
       int findKthLargest(vector<int>& nums, int k) {
            int left = 0, right = nums.size() - 1;  
            while (true) {
                int idx = partition(nums, left, right);
                if (idx == k - 1) {
                    return nums[idx];
                }
                if (idx < k - 1) {
                    left = idx + 1;
                } else {
                    right = idx - 1;
                }
            }
            return 0;
        }
        int partition(vector<int>& nums, int left, int right) {
            int pivot = nums[left], i = left + 1, j = right;
            while (i <= j) {
                if (nums[i] < pivot &&  pivot < nums[j] ) {
                    swap(nums[i++], nums[j--]);
                }
                if (nums[i] >= pivot) {
                    i++;
                }
                if (pivot >= nums[j]) {
                    j--;
                }
            }
            swap(nums[left], nums[j]);
            return j;
        }
    };
     1 class Solution {
     2 public:
     3    int findKthLargest(vector<int>& nums, int k) {
     4         int N = nums.size();
     5         for(int i = N/2;i>=0;i--) {
     6             sink(nums,i,N);
     7         }
     8         for (int n = N-1;n>=N-k+1;n--) {
     9             swap(nums[0],nums[n]);
    10             sink(nums,0,n);
    11         }
    12         return nums[0];
    13     }
    14     void sink(vector<int>& nums, int i, int n) {
    15         while(i*2+1<n) {
    16             int j = i*2+1;
    17             if (j+1<n && nums[j+1] > nums[j]) j++;
    18             if (nums[i] < nums[j]) {
    19                 swap(nums[i],nums[j]);
    20                 i = j;
    21             } else {
    22                 break;
    23             }
    24         }
    25     }
    26      
    27 };
  • 相关阅读:
    你不知道的空格
    导致你的微服务走向失败的11个原因
    阿里巴巴正式开源 Inclavare Containers 技术
    如何分辨区块链传销项目?
    编写干净的 React Components & JSX
    面试:3年工作经验程序员应有的技能
    数据库设计规范化的 5 个要求
    mac下镜像飞速安装Homebrew教程
    对优秀程序员的思考
    程序员理想中的工作环境
  • 原文地址:https://www.cnblogs.com/zle1992/p/16042166.html
Copyright © 2020-2023  润新知