解题思路:
1.先把数组为空和数组的长度为1时的特殊情况分别开来。声明一个sum变量用于计算数组中的连续子数组的总和值 。在声明一个guo变量用于一种接收sum中的前i-1的总和。另一种接收sum中前i的总和,主要根据sum的值来判断是接收的哪一种。在声明一个guo变量用于接收最大和的连续子数组的值。
2.在遍历过程中要把sum分情况来进行赋值和更新。如果当前i-1的sum值小于o,为负数时就抛弃前i-1的sum值,把nums【i】的值复制给sum。如果当前i-1的sum值大于0,我们就要更新sum值来判断是前i-1的sum值大还是前i的sum值大。之后再来更新连续最大和。我写这题时我敢觉的思路有点抽向和奇特,一股脑的写下去,所以我不知道这个解法属于哪一类算法。
class Solution {
public int maxSubArray(int[] nums) {
//数组为空时
if(nums.length<1){
return 0;
}
//数组的长度为1时
if(nums.length==1){
return nums[0];
}
//计算数组中的连续子数组的总和值
int sum=nums[0];
//一种接收sum中的前i-1的总和。另一种接收sum中前i的总和。主要根据sum的值来判断是接收的哪一种。
int guo=0;
//接收最大和的连续子数组的值
int max=nums[0];
for(int i=1;i<nums.length;i++){
//把前i-1的sum值赋值给guo
guo=sum;
//判断前i-1的sum值小于o,为负数时就抛弃前i-1的sum值
if(sum<0){
//把nums【i】的值复制给sum
sum=nums[i];
//来更新连续最大和
max=Math.max(max,sum);
continue;
}
//如果前i-1的sum值大于0,我们就要更新sum值来判断是前i-1的sum值大还是前i的sum值大
sum+=nums[i];
//判断是前i-1的sum值大还是前i的sum值大。括号中的guo为前i-1的zum值
guo=Math.max(guo,sum);
//来更新连续最大和
max=Math.max(max,guo);
}
return max;
}
}
动态规划解法;
1.先把数组为空和数组的长度为1时的特殊情况分别开来,之后声明一个dp数组表示下标为i时的连续最大和,初始化dp数组的值为nums[0],递推公式为dp[i]=Math.max(dp[i-1]+nums[i],nums[i]),文章来源:https://www.toymoban.com/news/detail-828360.html
判断是前i的dp数组值大还是当前nums[i]的值大,赋值给dp数组dp[i]。最后来更新连续最大和文章来源地址https://www.toymoban.com/news/detail-828360.html
class Solution {
public int maxSubArray(int[] nums) {
//数组为空时
if(nums.length<1){
return 0;
}
//数组的长度为1时
if(nums.length==1){
return nums[0];
}
//声明dp数组,dp数组表示下标为i时的连续最大和
int dp[]=new int [nums.length];
//初始化dp数组
dp[0]=nums[0];
//接受最大和值
int max=nums[0];
//for循环遍历来进行推导后面的dp数组的值
for(int i=1;i<nums.length;i++){
//递推公式
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
//判断最大值和对比最大值
max=Math.max(dp[i],max);
}
return max;
}
}
到了这里,关于力扣:53. 最大子数组和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!