1. 程式人生 > 實用技巧 >C語言|求陣列第k大數|partition、優先佇列大頂堆

C語言|求陣列第k大數|partition、優先佇列大頂堆

在未排序的陣列中找到第 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
說明:

你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

排序

8ms

int
cmp(const void*a,const void *b){ return *(int*)b-*(int*)a; } int findKthLargest(int* nums, int numsSize, int k){ qsort(nums, numsSize, sizeof(int), cmp); return nums[k-1]; }

partition思想

8ms

void exchange(int *a, int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}

int partition(int* nums, int
l, int r){ srand(time(NULL)); int random=rand()%(r-l+1)+l; exchange(&nums[random], &nums[r]); int i, j, pivot=nums[r]; for(i=l-1, j=l; j<=r-1; j++){ if(nums[j]>=pivot){ i++; exchange(&nums[i], &nums[j]); } } i
++; exchange(&nums[i], &nums[r]); return i; } int selection(int *nums, int l, int r, int k){ int p=partition(nums, l, r); int res; if(k==p-l+1) res = nums[p]; else if(k>p-l+1){ res = selection(nums, p+1, r, k-(p-l+1)); } else{ res = selection(nums, l, p-1, k); } return res; } int findKthLargest(int* nums, int numsSize, int k){ return selection(nums, 0, numsSize-1, k); }

優先佇列,大頂堆

8ms

void exchange(int *a, int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}

void maxHeapify(int a[], int i, int heapSize){
    int l=2*i+1, r=2*i+2, largest=i;
    if(l<heapSize && a[l]>a[largest]) largest=l;
    if(r<heapSize && a[r]>a[largest]) largest=r;
    if(largest != i){
        exchange(&a[largest], &a[i]);
        maxHeapify(a, largest, heapSize);
    } 
}

void buildMaxHeap(int a[], int Len){
    int i, heapSize=Len;
    for(i=(heapSize-1)/2; i>=0; i--){
        maxHeapify(a, i, heapSize);
    }
}

int findKthLargest(int* nums, int numsSize, int k){
    int res, i, j;
    int *a=(int*)malloc(sizeof(int)*k);
    for(i=0; i<k; i++) a[i]=nums[i];
    buildMaxHeap(a, k);
    for(i=k; i<numsSize; i++){
        if(nums[i]<a[0]){
            a[0]=nums[i];
            maxHeapify(a,0, k);
        }
    }
    return a[0];
}