题目描述:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
class Solution{ public int maxSubArray(int nums[]){ int res = nums[0];//3.初始化 for(int i=1;i<nums.length;i++){//4.遍历 nums[i]+=Math.max(nums[i-1],0);//状态定义1.dp[i] = nums[i] //2.状态转移:dp[i]+=Math.max(nums[i-1],0) res = Math.max(res,nums[i]); } return res;//5.返回坐标 } }
dp五部曲: 1.状态定义(确定dp数组及其下标含义):dp[i]为长度为i的绳子剪成m段最大乘积为dp[i] 2.状态转移(确定递推公式):dp[i]有两种途径可以转移得到 2.1 由前一个dp[j]*(i-j)得到,即前面剪了>=2段,后面再剪一段,此时的乘积个数>=3个 2.2 前面单独成一段,后面剩下的单独成一段,乘积为j*(i-j),乘积个数为2 两种情况中取大的值作为dp[i]的值,同时应该遍历所有j,j∈[1,i-1],取最大值 3.初始化(dp数组初始化):初始化dp[1]=1即可 4.遍历顺序:显然为正序遍历 5.返回坐标:返回dp[n]标签:初始化,遍历,乘积,Offer,int,42,数组,dp From: https://www.cnblogs.com/zhz123567/p/17325942.html