LeetCode215:数组中的第k个最大的元素

news/2024/5/19 21:45:28 标签: 数据结构, leetcode, 算法, 快速排序, 排序算法
/*
 在未排序的数组中找到第 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
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

class Solution {
public:
    int Partition(vector<int> &vec,int left,int right)
    {
        swap(vec[left],vec[rand()%(right-left+1)+left]);
        int v=vec[left];
        int i=left+1;
        int j=right;
        while(1)
        {
            while(i<=right && vec[i]<v) i++;
            while(j>=left && vec[j]>v)  j--;
            if(i>j)
                break;
            swap(vec[i],vec[j]);
        }
        swap(vec[left],vec[j]);
        return j;
    }
    int findKthLargest(vector<int>& nums, int k) {
        int left=0;
        int right=nums.size()-1;
        int target=nums.size()-k;
        while(1)
        {
            int index=Partition(nums,left,right);
            if(index==target)
                return nums[index];
            else if(index<target)
                left=index+1;
            else
                right=index-1;
        }
        
    }
    
    //利用小根堆的性质,维持堆中的元素个数始终为k,最有返回堆顶的元素
    int findKthLargest2(vector<int>& nums, int k) {
        
        priority_queue<int,vector<int>,greater<int> > p;
        
        for(int i=0;i<nums.size();i++)
        {
            p.push(nums[i]);
            if(p.size()>k)
            {
                p.pop();
            }
        }
        return p.top();
    }
    
    
};
int main()
{
    vector<int> vec{4,6,2,3,1,5,7,8};
    int k=2;
    cout<<Solution().findKthLargest2(vec, k);
}



http://www.niftyadmin.cn/n/923607.html

相关文章

如何设计一个公平的洗牌算法

什么叫公平呢&#xff1f;一旦你开始思考这个问题&#xff0c;其实答案不难想到。洗牌的结果是所有元素的一个排列。一副牌如果有 n 个元素&#xff0c;最终排列的可能性一共有 n! 个。公平的洗牌算法&#xff0c;应该能等概率地给出这 n! 个结果中的任意一个。 如思考虑到这一…

LeetCode167:Two Sun II-输入有序的数组

/*给定一个已按照升序排列 的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2&#xff0c;其中 index1 必须小于 index2。说明:返回的下标值&#xff08;index1 和 index2&#xff09;不是从零开始的。你可以假设每个输…

LeetCode11:盛水最多的容器

给定 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

LeetCode209:长度最小的子数组

/*给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。示例:输入: s 7, nums [2,3,1,2,4,3]输出: 2解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。*/…

LeeetCode3:无重复字符的最大长度

/*给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串…

LeetCode349:两个数组的交集

/*给定两个数组&#xff0c;编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2]输出: [2]示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4]输出: [9,4]*/ /* 我们将nums1中的数据全部存储到一个set中&#xff0c;因为set默认是不能重复的&#xff0c…

LeetCode350:两个数字的交集II

/*给定两个数组&#xff0c;编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2]输出: [2,2]示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4]输出: [4,9]*/ /*由于这次我们要输出所有的交集&#xff0c;包括重复的数字&#xff0c;所以我们就要声明一…

LeetCode242:有效的字母异位词

/* leetcode 438 76(滑动窗口)不会*//*给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s "anagram", t "nagaram"输出: true示例 2:输入: s "rat", t "car"输出: false说明:你可以…