c plus plus 弯曲曲线得到个区间的最大值和最小值
时间: 2023-09-30 17:05:41 浏览: 167
你可以通过遍历区间中的每一个元素,在每个位置上分别计算区间以该元素为结尾的最大值和最小值,然后取其中的最大值和最小值作为区间的最大值和最小值。
具体实现可以使用动态规划的思路,定义两个数组 maxVal 和 minVal,其中 maxVal[i] 表示区间 [0, i] 中的最大值,minVal[i] 表示区间 [0, i] 中的最小值。状态转移方程如下:
maxVal[i] = max(maxVal[i-1] + nums[i], nums[i])
minVal[i] = min(minVal[i-1] + nums[i], nums[i])
其中 nums[i] 表示区间中第 i 个元素的值。最终的区间最大值和最小值分别为 maxVal[n-1] 和 minVal[n-1],其中 n 表示区间的长度。
下面是一个 C++ 实现示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int maxVal(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<int> maxVal(n), minVal(n);
maxVal[0] = minVal[0] = nums[0];
int res = nums[0];
for (int i = 1; i < n; i++) {
maxVal[i] = max(maxVal[i-1] + nums[i], nums[i]);
minVal[i] = min(minVal[i-1] + nums[i], nums[i]);
res = max(res, maxVal[i]);
}
return res;
}
int minVal(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<int> maxVal(n), minVal(n);
maxVal[0] = minVal[0] = nums[0];
int res = nums[0];
for (int i = 1; i < n; i++) {
maxVal[i] = max(maxVal[i-1] + nums[i], nums[i]);
minVal[i] = min(minVal[i-1] + nums[i], nums[i]);
res = min(res, minVal[i]);
}
return res;
}
int main() {
vector<int> nums = {1, -2, 3, 4, -5, 6, -7};
cout << "Max value: " << maxVal(nums) << endl;
cout << "Min value: " << minVal(nums) << endl;
return 0;
}
```
阅读全文