zoukankan      html  css  js  c++  java
  • Leetcode-215. 数组中的第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
    说明:

    你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    class Solution {
    public:
        int findKthLargest(vector<int>& nums, int k) {
            int ans = find_k_min(nums, k-1, 0, nums.size()-1);
            return ans;
        }
        int find_k_min(vector<int>& nums, int k, int left, int right)
        {
            if(left== right) return nums[left];
            int k_site = find_k(nums, left, right);
            
            if(k== k_site) return nums[k_site];
            else if (k< k_site) return find_k_min(nums, k, left, k_site-1);
            else return find_k_min(nums, k, k_site+1, right);
        }
        int find_k(vector<int>& num, int left, int right)
        {
            int site= left; //任取一个点作为轴
            int x = num[site]; 
            swap(num[site], num[right]); //将作为分界的值放在最后;
            int cnt = left;
            
            for (int i = left; i< right; i ++) 
            {
                if(num[i]> x)
                {
                    /*如果A[i]> x, 则把A[i]放到左边*/
                    swap(num[i], num[cnt]);
                    cnt++;
                }
            }
            
            site = cnt;
            swap(num[right], num[site]);
            return site;
        }
    };
  • 相关阅读:
    2019ICPC上海站
    “浪潮杯”第九届山东省ACM大学生程序设计竞赛重现赛(2018)
    集合问题
    后缀数组
    141. 周期(KMP)
    求和(矩阵快速幂)
    大数(KMP)
    1270: [蓝桥杯2015决赛]完美正方形
    AC自动机
    8.26作业
  • 原文地址:https://www.cnblogs.com/Amaris-diana/p/13266526.html
Copyright © 2011-2022 走看看