题目:EPI
提示:
把递减序列改成递增序列,然后各个递增序列切割开分别组成一个数组,即一共有k个递增数组。利用最小堆的特点,按照递增规则合并这k个数组。
template<typename T>
class compare
{
public:
const bool operator()(const pair<T, int> &a, const pair<T, int> &b) const
{
return a.first > b.first;
}
};
vector<int> merge_array(const vector<vector<int>> &s)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, compare<int>> min_heap;
vector<int> s_index(s.size(), 1);
vector<int> res;
for (int i = 0; i < s.size(); i++)
{
min_heap.emplace(s[i][0],i);
//min_heap.push(pair<int, int>(s[i][0], i));对比push和emplace的用法
}
while (!min_heap.empty())
{
pair<int, int> p = min_heap.top();
res.push_back(p.first);
min_heap.pop();
if (s_index[p.second] < s[p.second].size())
{
min_heap.emplace(s[p.second][s_index[p.second]], p.second);
s_index[p.second]++;
}
}
return res;
}
vector<int> sort_k_increasing_decreasing(const vector<int> &num)
{
if (num.size() <= 1)
return vector<int>(num);
vector<vector<int>> s;
bool is_increase = num[0]<=num[1];
int start = 0;
for (int i = 1; i < num.size(); i++)
{
if ((num[i - 1] > num[i] && is_increase) || (num[i - 1] <= num[i] && !is_increase))
{
if (is_increase)
{
s.emplace_back(num.begin() + start, num.begin() + i);//注意第二个参数end 要加1啊!!!
}
else
{
//int len = i - 1 - start + 1;
s.emplace_back(num.begin() + start, num.begin() + i );//注意第二个参数end 要加1啊!!!
reverse(s.back().begin(), s.back().end());
}
start = i;
is_increase = !is_increase;
}
}
if (is_increase)
{
s.emplace_back(num.begin() + start, num.end());
}
else
{
//int len = i - 1 - start + 1;
s.emplace_back(num.begin() + start, num.end());
reverse(s.back().begin(), s.back().end());
}
return merge_array(s);
}
//测试代码
int a[] = { 10, 20, 30, 25, 3, 0, 89, 99, 109, 119, 45, 44, 43, 89 };
vector<int> num;
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
num.push_back(a[i]);
vector<int> r = sort_k_increasing_decreasing(num);
for (int i = 0; i < r.size(); i++)
cout << r[i] << "\t";
cout << endl;