C語言|求陣列第k大數|partition、優先佇列大頂堆
阿新 • • 發佈:2020-10-11
在未排序的陣列中找到第 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
intcmp(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, intl, 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]; }