帮我写一个求最大和的连续子数组问题的C++代码
时间: 2024-05-03 16:23:37 浏览: 65
当然可以,请看下面的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 计算最大子数组的和
int maxSubArraySum(int arr[], int n) {
int max_sum = arr[0], cur_sum = 0;
for (int i = 0; i < n; i++) {
cur_sum += arr[i];
if (cur_sum > max_sum) {
max_sum = cur_sum;
}
if (cur_sum < 0) {
cur_sum = 0;
}
}
return max_sum;
}
int main() {
// 测试数据
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int n = sizeof(arr) / sizeof(arr[0]);
// 输出结果
printf("最大子数组的和为:%d\n", maxSubArraySum(arr, n));
return 0;
}
```
希望这个代码能够帮到你。
相关问题
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。请用C++编写完整代码
给定一个整数数组 `nums`,可以使用Kadane算法来解决这个问题。该算法的基本思想是维护两个变量:`currentSum` 表示当前子数组的和,`maxSoFar` 存储到目前为止遇到的最大和。当遍历数组时,如果当前元素加上 `currentSum` 后大于0,则更新 `currentSum`;否则,说明前缀和已变为负数,应该从当前元素开始计算新的子数组。
以下是使用C++编写的完整代码:
```cpp
#include <vector>
#include <climits>
int maxSubArray(std::vector<int>& nums) {
if (nums.empty()) return 0; // 如果数组为空,最大和为0
int currentSum = nums[0]; // 初始化当前和为第一个元素
int maxSoFar = nums[0]; // 初始化最大和也为第一个元素
for (size_t i = 1; i < nums.size(); ++i) {
currentSum = std::max(nums[i], currentSum + nums[i]); // 更新当前和
maxSoFar = std::max(maxSoFar, currentSum); // 更新最大和
}
return maxSo_far;
}
给定一个int数组,请使用C++找出和最大的连续子数组
可以使用Kadane算法来解决这个问题,该算法的时间复杂度为O(n)。以下是示例代码:
```c
#include <stdio.h>
int maxSubArray(int* nums, int numsSize){
int maxSum = nums[0];
int curSum = nums[0];
for (int i = 1; i < numsSize; i++) {
curSum = curSum > 0 ? curSum + nums[i] : nums[i];
maxSum = maxSum > curSum ? maxSum : curSum;
}
return maxSum;
}
int main() {
int nums[] = {-2,1,-3,4,-1,2,1,-5,4};
int numsSize = sizeof(nums) / sizeof(nums[0]);
int maxSum = maxSubArray(nums, numsSize);
printf("The maximum sum of contiguous subarray is %d\n", maxSum);
return 0;
}
```
输出结果为:
```
The maximum sum of contiguous subarray is 6
```
该算法的思路是遍历整个数组,维护两个变量:当前连续子数组的和curSum和最大连续子数组的和maxSum。对于每个元素,如果curSum大于0,则将其加入curSum中,否则将curSum更新为当前元素。每次更新maxSum时,比较curSum和maxSum的大小,取较大值作为新的maxSum。最终返回maxSum即可。
阅读全文