- 描述:Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Example,
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
分析:这道题是要求在数组中寻找第k大的数字
思路一:(冒泡排序)直接对数组进行排序后寻找。
(430ms)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i; j < nums.size(); j++) {
if (nums[i] < nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
return nums[k - 1];
}
};
这种解法虽然被accept,但是却毫无技巧可言
- 思路二:(快速排序)快排本质上还是使用了divied and conquer方法来进行排序,相对于冒泡排序时间复杂度会小很多。
(66ms)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
quicksort(nums, 0, nums.size() - 1);
return nums[k - 1];
}
private:
void quicksort(vector<int>& nums, int left, int right) {
if (left < right) {
int key = nums[left];
int low = left;
int high = right;
while(low < high){
while(low < high && nums[high] <= key){
high--;
}
nums[low] = nums[high];
while(low < high && nums[low] >= key){
low++;
}
nums[high] = nums[low];
}
nums[low] = key;
quicksort(nums,left,low-1);
quicksort(nums,low+1,right);
}
}
};