1.弱智双stack
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
stack<int>s1,s2;
for(int i = 0;i<nums.size();i++)
{
if(s1.empty() || s1.top()<=nums[i])
{
s1.push(nums[i]);
}
else if(s1.top()>nums[i])
{
while(!s1.empty() && s1.top()>nums[i])
{
s2.push(s1.top());
s1.pop();
}
s1.push(nums[i]);
while(!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
}
}
int cnt = 1;
while(cnt < k)
{
s1.pop();
cnt++;
}
return s1.top();
}
};
2.第二种桶排序是我看其他同学写的:
基本思想是把所有元素塞到a[i]-min的桶里面,因为所有桶的取值只能是在Max-Min中,所以相当于从大到小做了个排序,(桶)数组的坐标其实本来就是升序的,有点巧妙。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int Max = INT_MIN,Min = INT_MAX;
for(int num : nums)
{
Max = max(Max,num);
Min = min(Min,num);
}
vector<int>a(Max-Min+1,0);
for(int num : nums) a[num-Min]++;
for(int i = a.size()-1;i>=0;i--)
{
k-=a[i];
if(k<=0) return Min+i;
}
return 0;
}
};