leedcode215 陣列中第k大的元素

2021-09-25 09:25:18 字數 1406 閱讀 4151

思路參考:

方法一:類似於冒泡法,取最後乙個為基準,從前向後遍歷,比基準數大就交換。

一次遍歷完成之後,基準數字置減一,開始第二次比較。

重複k次,即可求得第k大元素。

定義兩個指標sm,bi,和乙個當前位置指標,則arr[0,sm]比標定點大,arr[sm+1,i-1]表示和標定點相等,arr[bi,n-1]表示比標定點小。判斷排序後的標定點是否是第k大元素,如果不是,且比k大,則在比標定點大的範圍內繼續劃分;比k小,在比標定點小的範圍繼續劃分。

如果排成了從小打到的陣列,則將k變為n-k+1代入即可。

時間複雜度:不太會計算,待求

swap(nums[lf], nums[mid]);這一步應該可以不要,不知道為何要加

#include#include#includeusing namespace std;

class solution1

int partitionk(vector& nums, int lf, int rg, int targ)

else if (nums[i] > im)

else

} if (targ - 1 <= sm)

return partitionk(nums, lf, sm, targ);

else if (targ - 1 >= bi)

return partitionk(nums, bi, rg, targ);

else

return nums[targ - 1];

}};class solution2

int partitionk(vector& nums, int lf, int rg, int targ)

else if (nums[i] < im)

else

} if (targ - 1 <= sm)

return partitionk(nums, lf, sm, targ);

else if (targ - 1 >= bi)

return partitionk(nums, bi, rg, targ);

else

return nums[targ - 1];

}};int main(int argc, char** ar**)

; vectorvec1(a, a+sizeof(a)/sizeof(int));

int result1;

result1 = solution2().findkthlargest(vec1, 2);

cout << result1 << endl;

return 0;

}

方法三:使用堆, 維護乙個元素個數為k的最大堆, 將所有數字放入到最大堆中, 全部放完之後, 最大堆中最小的那個元素就是第k個最大的元素。 這個方法以後再嘗試。

215 陣列中的第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 說明 你可以假設 k 總是有效的,且 1...

DC leetcode215陣列中的第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說明 你可以假設 k 總是有效的,且 1 k 陣...

LeetCode 215 陣列中的第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 說明 你可以假設 k 總是有效的,且 1...