连续字符最大和 c++ 多种方法
时间: 2024-03-15 08:44:34 浏览: 56
好的,关于连续字符最大和的问题,下面我为您介绍几种 C++ 的实现方法:
1. 前缀和:使用前缀和可以将时间复杂度从 O(n^2) 优化到 O(n)。具体实现可以参考下面的代码:
```c++
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> preSum(n + 1);
int ans = nums[0];
for (int i = 1; i <= n; i++) {
preSum[i] = preSum[i - 1] + nums[i - 1];
}
int minPre = preSum[0];
for (int i = 1; i <= n; i++) {
ans = max(ans, preSum[i] - minPre);
minPre = min(minPre, preSum[i]);
}
return ans;
}
```
2. 动态规划:使用动态规划也可以解决这个问题。具体实现可以参考下面的代码:
```c++
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n);
dp[0] = nums[0];
int ans = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
ans = max(ans, dp[i]);
}
return ans;
}
```
3. 分治法:使用分治法也可以解决这个问题。具体实现可以参考下面的代码:
```c++
int maxSubArray(vector<int>& nums) {
int n = nums.size();
if (n == 1) {
return nums[0];
}
int mid = n / 2;
vector<int> left(nums.begin(), nums.begin() + mid);
vector<int> right(nums.begin() + mid, nums.end());
int leftMax = maxSubArray(left);
int rightMax = maxSubArray(right);
int crossMax = nums[mid - 1] + nums[mid];
int crossSum = crossMax;
for (int i = mid - 2; i >= 0; i--) {
crossSum += nums[i];
crossMax = max(crossMax, crossSum);
}
crossSum = crossMax;
for (int i = mid; i < n; i++) {
crossSum += nums[i];
crossMax = max(crossMax, crossSum);
}
return max(leftMax, max(rightMax, crossMax));
}
```
以上就是几种 C++ 实现连续字符最大和的方法,希望对您有所帮助。
阅读全文