题目描述
给定一个无序的整型数组A[n],数组大小大于等于3,允许有值相同的元素;请设计算法找到该数组排序后第三大的元素值并输出.
输入描述:
一个非空的整数数组(至少有3个元素,可正可负)
输出描述:
第三大的元素值
示例1
输入
复制
[1,2,3,4,5]
输出
复制
3
示例2
输入
复制
[1,1,2,2,3]
输出
复制
2
示例3
输入
复制
[6,5,4,4,1,2]
输出
复制
4
题解:利用快排的思想求解。
#include <bits/stdc++.h>
using namespace std;
void read(vector <int> & vec){
char ch;
int num = 0, sg = 1;
while((ch = getchar()) != ']'){
if(ch == '['){
continue;
}
if(ch != ','){
if(ch == '-'){
sg = -1;
} else{
num = num * 10 + (ch - '0');
}
} else{
vec.push_back(num * sg);
num = 0;
sg = 1;
}
}
vec.push_back(num * sg);
}
int divde(int l, int r, vector<int>& vec){
int low = l, high = r;
int pav = vec[low];
while(low < high){
while(low < high && vec[high] >= pav) high--;
if(low < high) vec[low] = vec[high], low++;
while(low < high && vec[low] <= pav) low++;
if(low < high) vec[high] = vec[low], high--;
}
vec[low] = pav;
return low;
}
void Find(int l, int r, int k, int& val, vector<int>& vec){
if(l >= r){
if(l == k){
val = vec[l];
}
return;
}
int foo = divde(l, r, vec);
if(k <= foo){
Find(l, foo, k, val, vec);
} else {
Find(foo + 1, r, k, val, vec);
}
}
int main(){
vector<int> vec;
read(vec);
int val = 0;
Find(0, vec.size() - 1, vec.size() - 3, val, vec);
cout << val << "\n";
return 0;
}