1>题目描述
-
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [0] 输出:0 示例 4: 输入:nums = [-1] 输出:-1 示例 5: 输入:nums = [-100000] 输出:-100000
2>暴力递归
2.1、代码思路
- 1>若数组中仅有一个元素,输出该元素即可。
- 2>要想找到最大子序和,首先得从数组从左至右找到第一个大于0的元素。
- 找到该元素后以该元素为下一次遍历的头元素,扫描该元素直到末尾并把最大子序和存储起来。
- 3>若所有元素都小于等于0,则只需要输出数组中最大元素即可。
2.2、代码实现
class Solution {
public int maxSubArray(int[] nums) {
int max = 0;
int sum = 0;
boolean flag = false;
if(nums.length == 1){
return nums[0];
}
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
flag = true;
for(int j=i;j<nums.length;j++)
{
sum+=nums[j];
if(sum>max){
max = sum;
}
}
sum = 0;
}
}
if(flag == false){
max = nums[0];
for(int i=1;i<nums.length;i++){
if(nums[i]>max){
max = nums[i];
}
}
}
return max;
}
}
3>贪心算法
3.1、代码思路
- 1>在遍历数组过程中,若该元素前面的元素和小于等于0则舍弃,若该元素前的元素和大于0则相加。
- 2>在过程中记录最大子序和。
3.2、代码实现
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0],sum = nums[0];
for(int i=1;i<nums.length;i++){
sum = sum>0?sum+nums[i]:nums[i];
max = Math.max(max,sum);
}
return max;
}
}
4>动态规划
4.1、代码思路
- 1>从左至右遍历数组,若前一个元素大于0,则与现元素相加。
- 2>最后遍历数组,找出最大值。
4.2、代码实现
class Solution {
public int maxSubArray(int[] nums) {
for(int i=1;i<nums.length;i++){
nums[i] = nums[i-1]>0?nums[i]+nums[i-1]:nums[i];
}
int max =nums[0];
for(int j=1;j<nums.length;j++){
max = nums[j]>max?nums[j]:max;
}
return max;
}
}