您的位置:首页 > 产品设计 > UI/UE

LeetCode Devide & Conquer problem || Kth Largest Element in an Array

2017-03-05 01:20 453 查看

题目描述

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.

Difficulty:

medium

解题思路

如果不考虑题目tag,这道题非常简单,直接用sort函数将序列排序,返回第K大的元素即可,easy.

class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int kmax = nums[nums.size() - k];
return kmax;
}
};


考虑题目Tag中Divide and Conquer的要求,则需要自己写一个分治算法对序列进行排序了。排序算法中最经典的分治算法,就是快排(Quick Sort)了。

快排的基本思想是任取待排序对象序列中的某个对象(例如第一个对象)作为枢轴(pivot),按照该对象的关键字大小,将整个对象划分为左右两个子序列:

左侧子序列中所有对象的关键字都小于或等于枢轴对象的关键字;

右侧子序列中所有对象的关键字都大于枢轴对象的关键字;

枢轴对象则排在这两个子序列中间(这也是该对象最终应安放的位置)。

然后分别对这两个子序列重复实施上述方法,直到所有对象都排在相应的位置上为止。

class Solution {
public:
int partition(vector<int>& list, int low, int high){
int pivot = list[low];
while(low < high){
while(low < high && list[high] >= pivot) high--;
list[low] = list[high];
while(low < high && list[low] <= pivot) low++;
list[high] = list[low];
}
list[low] = pivot;
return low;
}
void quickSort(vector<int> &list, int low, int high){
if(low < high){
int pivot = partition(list, low, high);
quickSort(list, low, pivot - 1);
quickSort(list, pivot + 1, high);
}
}
int findKthLargest(vector<int>& nums, int k) {
quickSort(nums, 0, nums.size() - 1);
int kmax = nums[nums.size() - k];
return kmax;
}
};


然而题目还给了另一个提示Tag:Heap,先占一个Tag,以后用堆排序完成排序后再来补充完整(●ˇ∀ˇ●)~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息