【贪心、动态规划】53.最大子序和

先赞后看,良好习惯。
光看不赞、双商减半。

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

样例

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6
输入:nums = [1]
输出:1
输入:nums = [5,4,-1,7,8]
输出:23

思路一:贪心算法

思路:题目最终要求得最大子序的和,根据贪心算法的思想,则需要在每一轮遍历时,都基于当前元素,通过舍弃或累加求出当前最大和的最优解

变量:一共使用四个变量

  1. 当前值:当前遍历数组得到的数字
  2. 当前和:分两种情况:
    之前和 小于0时, 当前和 = 当前值
    之前和 大于0时, 当前和 = 当前和 + 之前和
  3. 之前和:遍历上一个数组元素时的当前和。
  4. 最大和:当前和 和 上一轮的 最大和 里更大的值。

以这个样例来进行分析 [5,4,-20,7,8]

第一轮第二轮第三轮第四轮第五轮
当前值54-2078
当前和55 + 4 = 99 +(-20) = -11(因为-11小于0所以被舍弃)78 + 7 = 15
之前和null59-117
最大和599915

所以最后的结果就是 15

根据思路可以写出代码

class Solution {
    public int maxSubArray(int[] nums) {
        int max_sum  = 0;   //最大和
        int cur_sum  = 0;   //当前和
        int per_sum  = 0;   //之前和

        for(int i = 0;i<nums.length ;i++){
            //初始化赋值
            if(i==0){
                cur_sum = nums[i];
                max_sum = nums[i];
                per_sum = cur_sum;
                continue;
            }
            
            if(per_sum < 0){
                cur_sum = nums[i];
            }else{
                cur_sum = per_sum + nums[i];
            }
            per_sum = cur_sum;
            max_sum = Math.max(cur_sum,max_sum);
            
        }

        return max_sum;
    }
}

提交结果:(空间复杂度有待优化)
在这里插入图片描述

思路二:动态规划算法

变量:一共使用两个个变量

  1. 当前值:当前遍历数组得到的数字
  2. 动态规划值:分两种情况:
    上一轮的动态规划值 小于0时, 本轮的动态规划值 = 当前值
    上一轮的动态规划值 大于0时, 本轮的动态规划值 = 当前值 + 上一轮的动态规划值

以这个样例来进行分析 [5,4,-20,7,8]

第一轮第二轮第三轮第四轮第五轮
当前值54-2078
动态规划值55 + 4 = 99 + (-20)= -11(因为-11小于0被舍弃)77 + 8 = 15

然后找到动态规划的最大值,所以就是 15

根据思路可以写出代码

class Solution {
    public int maxSubArray(int[] nums) {

        int dp[] = new int[nums.length];			//存放动态规划的值

        for( int i = 0 ; i < nums.length ; i++ ){
        
            if( i == 0 ){
            	//初始化第一个值
                dp[i] = nums[i];
                continue;
            }

            if( dp[i-1] < 0){
                dp[i] = nums[i];
            }else{
                dp[i] = dp[i-1] + nums[i];
            }

        }

        Arrays.sort(dp);

        return dp[nums.length-1];

    }
}

提交结果:(时间复杂度、空间复杂度均有待优化)
在这里插入图片描述

小结

通过实践,我们发现,贪心算法和动态规划算法都是典型的”趋利避害“的算法,舍弃对自己不利的,保留有利的。加深了我对于这两种算法的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AntyRia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值