C++ 所有k个子序列的最小值的最大值

C++ 所有k个子序列的最小值的最大值,c++,arrays,minimum,C++,Arrays,Minimum,你有一个n个元素的序列。从k元素的连续子序列中找出所有最小值的最大值。 我尝试了经典的方法,用它来计算所有长度为k的序列。然后取最小值。找到新的极小值数组的最大值 一个更为优化的解决方案是找到前k个元素的最小od,然后在它之后跳转。你跳过了一些迭代 你能给我一个更好的解决办法吗? 没关系,但我用的是C++。p> 好吧,虽然这可能是一项任务,但我希望您能感受到一种通用且简洁的STL风格来完成这些事情 template<typename Iter, typename T = typename

你有一个n个元素的序列。从k元素的连续子序列中找出所有最小值的最大值。 我尝试了经典的方法,用它来计算所有长度为k的序列。然后取最小值。找到新的极小值数组的最大值

一个更为优化的解决方案是找到前k个元素的最小od,然后在它之后跳转。你跳过了一些迭代

你能给我一个更好的解决办法吗?
没关系,但我用的是C++。p> 好吧,虽然这可能是一项任务,但我希望您能感受到一种通用且简洁的STL风格来完成这些事情

template<typename Iter, typename T = typename std::iterator_traits<Iter>::value_type>
std::pair<T, T> KConsecutiveMinMax(Iter first, Iter last, std::size_t K){
    if(std::distance(first, last) < K) return {};

    auto Sum = std::accumulate(first, first+K, T());
    auto Min = Sum;
    auto Max = Sum;
    for(auto left = first, right = first + K; right != last; Sum -= *left++, Sum += *right++)
        std::tie(Min, Max) = std::minmax(std::min(Min, Sum), std::max(Max, Sum));
    return {Min, Max};
}
输出:


这是练习吗?一个节目内容?
int main(){
    std::vector<int> v{2, 39, 1, 9, 8, 6, 3, 10, -42, 3, 8, 3, 2};
    auto ans = KConsecutiveMinMax(v.begin(), v.end(), 3);
    std::cout << "Min = " << ans.first << ", and Max = " << ans.second << std::endl;
}
Min = -31, and Max = 49