- 第k大元素
在数组中找到第k大的元素
样例
给出数组 [9,3,2,4,8],第三大的元素是 4
给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推
挑战
要求时间复杂度为O(n),空间复杂度为O(1)
思路:
在每一趟中,都会将一个数放入序列的指定位置,放入后,数组被分为两个独立的部分;该数的左边都是大于它的数,右边都是小于它的数。通过迭代,将整个数组从大到小排列。
利用快排的思想,如果在某一趟结束后,前面一部分的数为k-1个,该数为第k个(下标为k-1)
C++:
补充:vector &nums :vector是C++中的一个容器,可以动态的存放各种类型的数组。此处类比 int &a来思考这个定义。
class Solution {
public:
/*
* @param n: An integer
* @param nums: An array
* @return: the Kth largest element
*/
int kthLargestElement(int n, vector<int> &nums) {
// write your code here
return quickSort(nums,0,nums.size()-1,n);
}
int quickSort(vector<int> &nums,int left,int right,int n)
{
int i = left;
int j = right;
int temp = nums[i];
while(i<j)
{
while(i<j&&temp>=nums[j])
{
j--;
}
if(i<j)
{
nums[i] = nums[j];
i++;
}
while(i<j&&temp<=nums[i])
{
i++;
}
if(i<j)
{
nums[j] = nums[i];
j--;
}
}
if(i==n-1)
{
return temp;
}
else if(i>n-1)
{
return quickSort(nums,left,i-1,n);
}
else
{
return quickSort(nums,i+1,right,n);
}
}
};
Py3:
class Solution:
# @param k & A a integer and an array
# @return ans a integer
def kthLargestElement(self, k, A):
return self.quickSort(A,0,len(A)-1,k)
def quickSort(self,nums,left,right,k):
i = left
j = right
tmp = nums[i]
while i<j:
while i<j and tmp>=nums[j]:
j -= 1
if i<j:
nums[i] = nums[j]
i += 1
while i<j and tmp<=nums[i]:
i += 1
if i<j:
nums[j] = nums[i]
j -= 1
if i==k-1:
return tmp
elif i<k-1:
return self.quickSort(nums,i+1,right,k)
else:
return self.quickSort(nums,left,i-1,k)