Given an integer array
nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.A subarray is a contiguous part of an array.
给定一个整数数组
nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。Example 1:
Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.Example 2:
Input: nums = [1] Output: 1Example 3:
Input: nums = [5,4,-1,7,8] Output: 23
一些单词:
contiguous
英 [kənˈtɪɡjuəs] 美 [kənˈtɪɡjuəs]
adj.相接的;相邻的subarray
子数组的提取;子阵列;子数组;子阵;自阵列
这一题有点难度的,我的想法和官方的想法不太一样,官方用了动态规划和分治算法,我的想法有点类似于递归,先说一说我的思路吧:
首先我需要先创建一个数组,用来存储一些累加好的数,然后直接从这个数组中找到最大的那个数就是结果,所以,问题来了,需要怎么去累加呢?这有一个巧妙地办法。先来看看,我用了一个三元运算符,首先将原数组中地第一个名字赋值到新数组dp中,当作初始值了,然后for循环中将i的初始值设置为1,我们需要判断dp[i-1]是否大于0,为什么要这样想呢,因为我们要求的是最大的数,怎么着也得比0大吧,然后如果大于0的话那就将dp[i-1]和原数组nums[i]相加,之后赋值到新数组中,小于零的话直接dp[i] = nums[i]。
现在看看代码
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
for(int j = 1;j < nums.length;j++){
dp[i] = dp[i-1] > 0 ? dp[i-1] + nums[i] : nums[i];
}
int result = dp[0];
for(int j = 0;j < dp.length;j++){
result = Math.max(result,dp[j]);
}
return result;
}
还有一种解法,很不错,分享给大家
class Solution {
public int maxSubArray(int[] nums) {
int ans=Integer.MIN_VALUE,sum=0;
for(int i=0;i<nums.length;i++) {
sum=sum+nums[i];
if(sum>ans) ans=sum;
if(sum<0) sum=0;
}
return ans;
}
}