解题思路
这是一道求解连续子数组最大和的经典题目,主要思路如下:
-
问题分析:
- 给定一个整数数组
- 求所有连续子数组中的最大和
- 例如:[-1,2,1]中,最大和为[2,1]=3
-
解决方案:
- 使用动态规划
- 维护当前连续和
和全局最大和
- 如果当前和为负,则重新开始累加
- 每次更新时比较并更新最大和
-
状态转移:
代码
#include <iostream>
#include <vector>
using namespace std;
int maxSubArray(vector<int>& nums) {
int sum = nums[0]; // 当前连续和
int maxSum = nums[0]; // 全局最大和
for(int i = 1; i < nums.size(); i++) {
// 如果当前和为负,则重新开始累加
sum = sum > 0 ? sum + nums[i] : nums[i];
// 更新最大和
maxSum = max(maxSum, sum);
}
return maxSum;
}
int main() {
int n;
while(cin >> n) {
vector<int> nums(n);
for(int i = 0; i < n; i++) {
cin >> nums[i];
}
cout << maxSubArray(nums) << endl;
}
return 0;
}
import java.util.*;
public class Main {
public static int maxSubArray(int[] nums) {
int sum = nums[0]; // 当前连续和
int maxSum = nums[0]; // 全局最大和
for(int i = 1; i < nums.length; i++) {
// 如果当前和为负,则重新开始累加
sum = sum > 0 ? sum + nums[i] : nums[i];
// 更新最大和
maxSum = Math.max(maxSum, sum);
}
return maxSum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
System.out.println(maxSubArray(nums));
}
}
}
def max_sub_array(nums):
sum_val = nums[0] # 当前连续和
max_sum = nums[0] # 全局最大和
for i in range(1, len(nums)):
# 如果当前和为负,则重新开始累加
sum_val = sum_val + nums[i] if sum_val > 0 else nums[i]
# 更新最大和
max_sum = max(max_sum, sum_val)
return max_sum
def main():
while True:
try:
n = int(input())
nums = list(map(int, input().split()))
print(max_sub_array(nums))
except EOFError:
break
if __name__ == "__main__":
main()
算法及复杂度
- 算法:动态规划
- 时间复杂度:
- 只需要遍历一次数组
- 空间复杂度:
- 只需要两个变量存储状态