给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。请用C++编写完整代码
时间: 2024-10-28 22:11:30 浏览: 7
给定一个整数数组 `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;
}
相关问题
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
思路:动态规划
1. 定义状态:dp[i]表示以第i个数结尾的最大子数组和
2. 状态转移方程:dp[i] = max(nums[i], dp[i-1]+nums[i])
3. 初始状态:dp[0] = nums[0]
4. 最终结果:遍历dp数组,求出最大值即可
Python代码:
```
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
dp = [0] * n
dp[0] = nums[0]
for i in range(1, n):
dp[i] = max(nums[i], dp[i-1]+nums[i])
return max(dp)
```
时间复杂度:O(n)
空间复杂度:O(n)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 用c++
语言实现的代码如下:
```c
#include <stdio.h>
#include <limits.h>
int maxSubArray(int* nums, int numsSize){
int maxSum = INT_MIN, curSum = 0;
for(int i = 0; i < numsSize; i++){
curSum += nums[i];
if(curSum > maxSum){
maxSum = curSum;
}
if(curSum < 0){
curSum = 0;
}
}
return maxSum;
}
int main(){
int nums[] = {-2,1,-3,4,-1,2,1,-5,4};
int numsSize = sizeof(nums) / sizeof(int);
int maxSum = maxSubArray(nums, numsSize);
printf("The maximum sum of contiguous subarray is %d\n", maxSum);
return 0;
}
```
解释:使用Kadane算法,初始化当前和curSum为0,最大和maxSum为INT_MIN。遍历数组,对于每个元素,将其加到curSum中,如果curSum大于maxSum,则更新maxSum。如果curSum小于0,则将其重置为0。最后返回maxSum即可。
阅读全文