今天刷题的时候,遇到了前缀和及差分,在这里记录一下。
关于前缀和及差分的知识可以看这篇文章 转载:前缀和与差分 图文并茂 超详细整理(全网最通俗易懂)
经过我在网上查了一顿之后,不出所料,STL提供了计算的函数。
- 前缀和:
partial_sum
,头文件:numeric
- 差分:
adjacent_difference
,头文件:numeric
下面是使用示范
#include <iostream>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::for_each;
using std::copy;
using std::partial_sum;
using std::adjacent_difference;
using std::ostream_iterator;
using std::vector;
int main()
{
int number;
cin >> number;
vector<int> array(number), result1(number), result2(number);
// 输入数组
for_each(array.begin(), array.end(), [](auto& element) { cin >> element; });
// 求数组的前缀和数组
partial_sum(array.begin(), array.end(), result1.begin());
// 求数组的差分数组
adjacent_difference(array.begin(), array.end(), result2.begin());
// 输出前缀和数组
copy(result1.begin(), result1.end(), ostream_iterator<int>(cout, " "));
cout.put('\n');
// 输出差分数组
copy(result2.begin(), result2.end(), ostream_iterator<int>(cout, " "));
cout.put('\n');
return 0;
}
输入:
5
1 3 1 7 5
输出:
1 4 5 12 17
1 2 -2 6 -2
使用就是如此简单,一行解决。此外,这两个函数都还支持自定义谓词。
下面这段代码可以实现和上面代码一样的效果。
#include <iostream>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::for_each;
using std::copy;
using std::partial_sum;
using std::adjacent_difference;
using std::ostream_iterator;
using std::vector;
// 自定义的谓词,模拟partial_sum默认的谓词
inline int func1(int a, int b)
{
return a + b;
}
// 自定义的谓词,模拟adjacent_difference默认的谓词
inline int func2(int a, int b)
{
return a - b;
}
int main()
{
int number;
cin >> number;
vector<int> array(number), result1(number), result2(number);
// 输入数组
for_each(array.begin(), array.end(), [](auto& element) { cin >> element; });
// 使用自定义的谓词求数组的前缀和数组
partial_sum(array.begin(), array.end(), result1.begin(), func1);
// 使用自定义的谓词求数组的差分数组
adjacent_difference(array.begin(), array.end(), result2.begin(), func2);
// 输出前缀和数组
copy(result1.begin(), result1.end(), ostream_iterator<int>(cout, " "));
cout.put('\n');
// 输出差分数组
copy(result2.begin(), result2.end(), ostream_iterator<int>(cout, " "));
cout.put('\n');
return 0;
}