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




import heapq
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:

        q = []
        res = nums[0]
        for i in range(len(nums)):
            if len(q) < k:
                heapq.heappush(q, nums[i])
            else:
                heapq.heappush(q,nums[i])
                heapq.heappop(q)

        return q[0]
        

  

 

 

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:

        def partition(nums, l, r):
            pivot = nums[l]
            i = l + 1
            j = r

            while i <= j:

                # 大的放左边
                while i <= j and nums[i] >= pivot:
                    i += 1

                # 小的放右边
                while i <= j and nums[j] <= pivot:
                    j -= 1

                if i <= j:
                    nums[i], nums[j] = nums[j], nums[i]

            nums[l], nums[j] = nums[j], nums[l]

            return j

        l = 0
        r = len(nums) - 1
        target = k - 1

        while l <= r:
            pos = partition(nums, l, r)

            if pos > target:
                r = pos - 1
            elif pos < target:
                l = pos + 1
            else:
                return nums[pos]

 

 

 

 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 };

 

 

posted @ 2022-03-22 23:34  乐乐章  阅读(119)  评论(0)    收藏  举报