思路參考:
方法一:類似於冒泡法,取最後乙個為基準,從前向後遍歷,比基準數大就交換。
一次遍歷完成之後,基準數字置減一,開始第二次比較。
重複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...