解题思路

这是一道求解连续子数组最大和的经典题目,主要思路如下:

  1. 问题分析:

    • 给定一个整数数组
    • 求所有连续子数组中的最大和
    • 例如:[-1,2,1]中,最大和为[2,1]=3
  2. 解决方案:

    • 使用动态规划
    • 维护当前连续和 和全局最大和
    • 如果当前和为负,则重新开始累加
    • 每次更新时比较并更新最大和
  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()

算法及复杂度

  • 算法:动态规划
  • 时间复杂度: - 只需要遍历一次数组
  • 空间复杂度: - 只需要两个变量存储状态