数组第k大的元素

一、数组第k大的元素

思路:1.快排
    2.大顶堆(手撕堆)

 //手撕堆排
 class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {  //手撸大根堆
       
       for(int i=nums.size()/2-1;i>=0;i--){  //第一次从nums.size()/2-1开始调整初始化原始大顶堆
           adjust(nums,nums.size(),i);
       }
       for(int i=nums.size()-1;i>nums.size()-k;i--){    //后续从末尾开始交换堆顶和堆尾元素。
            swap(nums[0],nums[i]);
            adjust(nums,i,0);
       }
       return nums[0];
    }
    void adjust(vector<int>& nums,int len,int root){   //核心就是堆调整函数
          int child_left=2*root+1;
          int child_right=2*root+2;
          int Max=root;
          if(child_left<len && nums[child_left]>nums[Max]) Max=child_left;
          if(child_right<len && nums[child_right]>nums[Max]) Max=child_right;
          if(Max==root) return;
          swap(nums[root],nums[Max]);
          adjust(nums,len,Max);
     }

};
//快排
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {  //快排
       return quick_sort(nums,k,0,nums.size()-1);

    }
    int quick_sort(vector<int>& nums, int k,int l,int r){
          int left=l,right=r;
          while(left<right){
              while(left<right && nums[right]>=nums[l])  right--;
              while(left<right && nums[left]<=nums[l])  left++;
              swap(nums[left],nums[right]);
          }
          swap(nums[left],nums[l]);
          if(nums.size()-left>k) return quick_sort(nums,k,left+1,r);
          if(nums.size()-left<k)  return quick_sort(nums,k,l,left-1);
          else return nums[left]; 
    }
  
};

你可能感兴趣的:(算法,leetcode,java)