leetcode排序的题 912. 排序数组 215. 数组中的第K个最大元素

排序数组,就不多写了

https://leetcode-cn.com/problems/sort-an-array/

数组中的第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 ≤ 数组的长度。

解:此题解法用快排比较方便,因为快排有个特点,每次循环结束后,标兵节点的位置就是正确位置;找到第k大的元素,不用每次左右两边都继续排序。只要看比当前标兵节点大或小,然后只计算左或右就可以

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        if(k>nums.size())
            return -1;
        
        quickSort(nums,0,nums.size()-1,nums.size()-k);
        return nums[nums.size()-k];
    }

    void quickSort(vector<int>& nums,int l,int r,int k)
    {
        if(l>=r)
        {
            return;
        }
        int tmp_l=l;
        int tmp_r=r;
        int target=nums[l];
        while(tmp_l<tmp_r)
        {
            while(nums[tmp_r]>=target&&tmp_l<tmp_r)
            {
                tmp_r--;
            }
            //这里等号一定要加,不然左边节点就一直不动了
            while(nums[tmp_l]<=target&&tmp_l<tmp_r)
            {
                tmp_l++;
            }
            if(tmp_l<tmp_r)
            {
                swap(nums[tmp_l],nums[tmp_r]);
            }
        }
        swap(nums[l],nums[tmp_l]);
        if(tmp_l<k)
        {
            return quickSort(nums,tmp_l+1,r,k);
        }
        else if(tmp_l>k)
        {
            return quickSort(nums,l,r-1,k);
        }
        else
            return ;
    }
};

 2020/6/29更新

1.上面的代码可以优化一下,当发现if(tmp_l==k),就可以返回了,不用继续排序。

这道题还可以用排序堆得做法,待更新

原文地址:https://www.cnblogs.com/wangshaowei/p/12331095.html