【动归】B016_最大和的子序列(dp)

一、题目描述

Given an integer array nums, find the contiguous subarray (containing at least one number) 
which has the largest sum and return its sum.

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

二、题解

方法一:dp

  • 定义状态
    • d p [ i ] dp[i] 表示位置 i 的 MS。
  • 思考状态转移方程
    • d p [ i ] = m a x ( d p [ i 1 ] + n u m s [ i ] ,   n u m s [ i ] ) dp[i] = max(dp[i-1] + nums[i],\ nums[i])
  • 思考初始化:
    • d p [ 0 ] = n u m s [ 0 ] dp[0] = nums[0]
  • 思考输出 m a x ( d p [ 0... N ] ) max(dp[0...N])
  • 空间压缩:是可以的,只是我不想在想了。
public int maxSubArray(int[] nums) {
  final int N = nums.length;
  int[] dp = new int[N];
  dp[0] = nums[0];
  int max = nums[0];
  for (int i = 1; i < N; i++) {
    dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
    max = Math.max(max, dp[i]);
  }
  return max;
}

复杂度分析

  • 时间复杂度: O ( N ) O(N)
  • 空间复杂度: O ( N ) O(N)

方法二:暴力法

做到后面,都不想用暴力了,一开始就用 dp,这里给出暴力的做法:

  • 使用双层循环,穷举所有的子区间;
  • 对每个子区间内的所有元素求和,得出最大和;

复杂度分析

  • 时间复杂度: O ( N 3 ) O(N^3)
  • 空间复杂度: O ( 1 ) O(1)
发布了461 篇原创文章 · 获赞 102 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/104699350