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



class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        # 2 1 4
        def paration(nums,l,r):
            i = l + 1
            j = r 
            pivot = nums[l]
            while i <= j :
                if nums[i] < pivot < nums[j]:
                    nums[i],nums[j] = nums[j],nums[i]
                    i+=1
                    j-=1
                if nums[i] >= pivot:
                    i+=1
                if nums[j] <= pivot:
                    j-=1
            nums[l], nums[j] = nums[j],nums[l]
            return j
        
        i = 0
        j = len(nums)-1 
        while 1:
            th = paration(nums,i,j)
            if th > k-1:
                j=th-1
            elif th < k-1:
                j = th+1
            else:
                return nums[th]
        return 0



            
          

 

 

class Solution {
public:
   int findKthLargest(vector<int>& nums, int k) {
        int left = 0, right = nums.size() - 1;  
        while (true) {
            int idx = partition(nums, left, right);
            if (idx == k - 1) {
                return nums[idx];
            }
            if (idx < k - 1) {
                left = idx + 1;
            } else {
                right = idx - 1;
            }
        }
        return 0;
    }
    int partition(vector<int>& nums, int left, int right) {
        int pivot = nums[left], i = left + 1, j = right;
        while (i <= j) {
            if (nums[i] < pivot &&  pivot < nums[j] ) {
                swap(nums[i++], nums[j--]);
            }
            if (nums[i] >= pivot) {
                i++;
            }
            if (pivot >= nums[j]) {
                j--;
            }
        }
        swap(nums[left], nums[j]);
        return j;
    }
};

 

 

 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  乐乐章  阅读(41)  评论(0编辑  收藏  举报