给定整数数组 nums
和整数 k
,请返回数组中第 k
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
你必须设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4],
k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6],
k = 4
输出: 4
提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
思路:找到第k个最大值,那我们最先想到的是先排再找。
常见的有选择排序、冒泡排序,但对于该题会出现超出时间复杂度的问题,我们本题时间复杂度要求在O(n),所以,我们换一种排序思想,我们选择快速排序,快排时间复杂度为O(nlogn)还是超出了时间限制 ,想练一下快排算法还是写了出来,有一个测试没过。
快排思路:选择第一个作为枢纽,选用双指针i,j,从右向左先进行遍历,如果第j个位置的元素值大于第一个枢纽值,那我们j--,用while循环继续从右向左进行,如果小于,那我们就要将i与j位置元素进行交换,从左向右进行遍历,那么i++,直到i与j相遇,说明,此时i所在的位置就为我们第一个枢纽的位置,这才是进行了第一场排序,我们采用递归的思想,将枢纽左边和右边的都进行快速排序,就为快排思想。
快排代码:
int ss(int *nums,int left,int right){
int temp;
temp=nums[left];
int i,j;
i=left;
j=right;
while(i<j){
while(i<j&&nums[j]<=temp){
j--;
}
if(i<j){
nums[i]=nums[j];
i++;
}
while(i<j&&nums[i]>temp){
i++;
}
if(i<j){
nums[j]=nums[i];
j--;
}
}
nums[i]=temp;
return i;
}
void Sortquick(int *nums,int left,int right){
if(left<right){
int i;
i=ss(nums,left,right);
Sortquick(nums,left,i-1);
Sortquick(nums,i+1,right);
}
}
本题代码:
int ss(int *nums,int left,int right){
int temp;
temp=nums[left];
int i,j;
i=left;
j=right;
while(i<j){
while(i<j&&nums[j]<=temp){
j--;
}
if(i<j){
nums[i]=nums[j];
i++;
}
while(i<j&&nums[i]>temp){
i++;
}
if(i<j){
nums[j]=nums[i];
j--;
}
}
nums[i]=temp;
return i;
}
void Sortquick(int *nums,int left,int right){
if(left<right){
int i;
i=ss(nums,left,right);
Sortquick(nums,left,i-1);
Sortquick(nums,i+1,right);
}
}
int findKthLargest(int* nums, int numsSize, int k) {
Sortquick(nums,0,numsSize-1);
return nums[k-1];
}
但还是超出了时间限制:
所以本题不能用快排思想。
改进后
int quicksort(int *nums,int left,int right,int k){
int temp=nums[left];
int i,j;
i=left;
j=right;
while(i<j){
while(i<j&&nums[j]<=temp){
j--;
}
if(i<j){
nums[i]=nums[j];
i++;
}
while(i<j&&nums[i]>temp){
i++;
}
if(i<j){
nums[j]=nums[i];
j--;
}
}
nums[i]=temp;
if(i+1==k){
return nums[i];
}
else{
if(i+1>k){
return quicksort(nums,left,i-1,k);
}
else{
return quicksort(nums,i+1,right,k);
}
}
}
int findKthLargest(int* nums, int numsSize, int k) {
int d;
d=quicksort(nums,0,numsSize-1,k);
return d;
}