215. 数组中的第K个最大元素

164 阅读2分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

题目描述

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

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

示例 1:

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

思路分析

这种题最简单的方式自然是直接sort,但是这并不是我们做这道题的意义。

如果只看数组中的第1个最大元素,我们需要一个整数型变量存储最大值,如果看数组中的第2个,那我们需要两个变量。然而我们未必真的需要k个元素作为缓存。

或许可以用一个数组进行存储,或者说是顺序表。然而数组在添加,删除这类操作上表现并不好。栈,队列与树同理。

因此我们可以使用最小堆来实现。

然而直接用只是说明我们对数据结构有所了解,单从学习角度考虑,不妨自己实现一版。

时间限制,暂时先只实现一版快排的。

具体实现

 int quickSort(int left, int right, vector<int>& arr, int top){
        //
        int p = arr[left];
        int left_tmp = left, right_tmp = right; 
        while(left < right){
            while(left < right && arr[right] <= p){
            right--;
            }
            arr[left] = arr[right];
            while(left < right && p <= arr[left])left++;
            arr[right] = arr[left];
        }
        // cout << "1" << endl;
        arr[left] = p;

        if (left == top - 1){
            return p;
        }
        if (left > top - 1)return quickSort(left_tmp, left - 1, arr, top);
        return quickSort(left + 1, right_tmp, arr, top);
    }
    int findKthLargest(vector<int>& nums, int k) {
        return quickSort(0, nums.size() - 1, nums, k);
    }

总结

需要注意的地方是,在完成一次排序后,其实只是确定了一个点的位置,因此可以用这个点与k-1做比较,如果恰好是k-1,则可以直接返回,否则根据两者大小关系决定遍历哪部分。同时由于已经确定left点不是答案,所以需要排除这个点,否则可能会出现死循环的现象。