class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int i=0;
int j=nums.size()-1;
k=k-1;
while(i<=j){
int p=partition(i,j,nums);
if(p==k)
return nums[p];
else if(p<k){
i=p+1;
while(i<k && nums[i]==nums[i-1])
i++;
}
else{
j=p-1;
while(j>k && nums[j]==nums[j+1])
j--;
}
}
return -1;
}
int partition(int i,int j,vector<int>& nums){
int left=i+1;
int right=j;
int tmp=nums[i];
while(left<=right){
while(nums[left]>=tmp && left<j){
left+=1;
}
while(nums[right]<=tmp && right>i){
right-=1;
}
if (left>=right)
break;
swap(nums[left], nums[right]);
// if(left<right){
// swap(nums[left], nums[right]);
// }
}
// nums[i]=nums[right];
// nums[right]=tmp;
swap(nums[i], nums[right]);
return right;
}
};
Focus:
1 while(i<=j) 里的“=”要有。最后是i,j移动
2 while(left<=right) 里的“=”要有。 i>j是可以存在的。等于之后,移动right,找到和tmp替换的位置
这道题真的让我清楚的明白了partition我有哪些漏的…
python
class Solution:
def partition(self,nums,left,right):
pivot=nums[left]
l=left+1
r=right
while l<=r:
while l<right and nums[l]>=pivot:
l+=1
while left<r and nums[r]<=pivot:
r-=1
if l>=r:
break
nums[l],nums[r]=nums[r],nums[l]
nums[left],nums[r]=nums[r],nums[left]
return r
def findKthLargest(self, nums: List[int], k: int) -> int:
left=0
right=len(nums)-1
while left<=right:
p=self.partition(nums,left,right)
if p==k-1:
return nums[p]
elif p<k-1:
left=p+1
while left<k-1 and nums[left]==nums[left-1]:
left+=1
else:
right=p-1
while right>k-1 and nums[right]==nums[right+1]:
right-=1
return -1