數組中的第K個最大元素leetcode(Top 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

 

TopK的問題,思路就是用堆來解決。

先以前K個元素構建一個大小為K的小頂堆,然后從K個元素之后,遍歷從索引在K后面的元素,如果有大於小頂堆的堆頂元素的,那么就交換兩個元素並重新構建小頂堆。遍歷到最后的小頂堆堆頂就是第K大的元素了。時間復雜度O(n+klogk)

class Solution {
    public int findKthLargest(int[] nums, int k) {
        if(nums.length<k){
            return 0;
        }
        HeapSort(nums,k-1);
        return nums[0];
        
    }
    public void HeapSort(int nums[],int len){
        int i;        
        for(i=len/2;i>=0;i--){
            HeapAdjust(nums,i,len);
        }
        for(i=len+1;i<nums.length;i++){
            if(nums[0]<=nums[i]){                
                swap(nums,0,i);
                HeapAdjust(nums,0,len);
            }                
        }
   
    }
    public void HeapAdjust(int a[],int start,int len){
        int temp,j;
        temp=a[start];
        for(j=2*start;j<=len;j*=2){
            if(j<len&&a[j]>a[j+1])
                j++;
            if(temp<=a[j])
                break;
            a[start]=a[j];
            start=j;
        }
        a[start]=temp;
    }
    public void swap(int nums[],int a,int b){
        int tmp=nums[a];
        nums[a]=nums[b];
        nums[b]=tmp;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM