你有一系列n个元素。找出从k个元素的连续子序列中获取的所有最小值的最大值。 我尝试了使用长度为k的所有序列的经典方法。然后采取最低限度。并找到新的最小数组的最大值。
更优化的解决方案是找到第一个k元素的最小od,然后在它之后跳转。你跳过一些迭代。
你能给我一个更好,更优化的解决方案吗? 没关系,但我使用的是C ++。
答案 0 :(得分:1)
嗯,虽然这可能是一项任务,但我希望你有一种通用且整洁的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};
}
它添加了数组的第一个K
元素,将它们分配给Sum
,Max
和Min
,然后添加K+1
元素,同时减去尾部元素。对于其中的每一项,它都会提取新的本地子序列总和的新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