function maxSubArray(nums: number[]): number {
let tmp = new Array(nums.length);
let res = nums[0];
tmp[0] = nums[0];
for(let i = 1; i < nums.length;i++){
tmp[i] = Math.max(nums[i] + tmp[i-1],nums[i]);
res = Math.max(res,tmp[i]);
}
return res;
};
class Solution {
public int maxSubArray(int[] nums) {
//找到每个位子最大子数组之和 要么能连续 要么取自己
int dp[]=new int[nums.length+1];
Arrays.fill(dp,Integer.MIN_VALUE+1);
int max =nums[0];
dp[1]=nums[0];
for(int i=2;i<=nums.length;i++)
{
dp[i]=Math.max(dp[i-1]+nums[i-1],nums[i-1]);
max = Math.max(max,dp[i]);
}
return max;
}
}
class Solution {
public int maxSubArray(int[] nums) {
int tmp = 0;
int res = nums[0];
for(int i = 0; i < nums.length; i ++) {
tmp = Math.max(tmp + nums[i], nums[i]);
res = Math.max(tmp,res);
}
return res;
}
}
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0;
int res = nums[0];
for(int num : nums){
pre = Math.max(pre + num, num);
res = Math.max(pre, res);
}
return res;
}
}
//动态规划
//O(n)
//O(n)
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int res = nums[0];
for(int i = 1; i < nums.length; i++){
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
res = Math.max(res, dp[i]);
}
return res;
}
}
//贪心
//O(n)
//O(1)
class Solution {
public int maxSubArray(int[] nums) {
int res = Integer.MIN_VALUE;
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
res = sum > res ? sum : res;
if(sum < 0){
sum = 0;
}
}
return res;
}
}
共以下 11 个回答
相对简单,优化成单变量的时候注意顺序
ts写的
class Solution {
public int maxSubArray(int[] nums) {
//找到每个位子最大子数组之和 要么能连续 要么取自己
int dp[]=new int[nums.length+1];
Arrays.fill(dp,Integer.MIN_VALUE+1);
int max =nums[0];
dp[1]=nums[0];
for(int i=2;i<=nums.length;i++)
{
dp[i]=Math.max(dp[i-1]+nums[i-1],nums[i-1]);
max = Math.max(max,dp[i]);
}
return max;
}
}
dp : 以第i个数为结尾的连续子数组的和
8.5
Day26:下面是代码