动态规划VS贪心算法:解密连续子数组最大和问题

题目

解法一:动态规划 

思路:

  1. 定义一个长度与原数组相同的数组 dp,用于存储以每个元素为结尾的连续子数组的最大和。

  2. 初始化 dp[0] 为原数组的第一个元素,同时将 max 设为 dp[0]。

  3. 从数组的第二个元素开始遍历,对于每个元素,计算以该元素为结尾的连续子数组的最大和,即 dp[i] = Math.max(dp[i-1] + array[i],array[i])。

  4. 在计算 dp[i] 的同时,更新 max 的值,即 max = Math.max(max,dp[i])。

  5. 遍历完成后,返回 max 的值,即为原数组中连续子数组的最大和。

 public static int FindGreatestSumOfSubArray(int[] array) {
     int[] dp = new int[array.length];
     dp[0] = array[0];
     int max = dp[0];
     for(int i = 1;i < dp.length;i++){
         dp[i] = Math.max(dp[i-1] + array[i],array[i]);
         max = Math.max(max,dp[i]);
     }
     return max;
 }

时间复杂度:O(n) 一层for循环

空间复杂度:O(n) 开辟了跟array数组长度一样的dp数组 

解法二:贪心算法

思路:

  1. 首先,定义了一个变量sum和max,分别表示当前连续子数组的和和最大子数组的和。还定义了一个变量temp,用来记录数组中的最大值。
  2. 然后,通过for循环遍历整个数组。在遍历过程中,先更新temp的值,找到数组中的最大值。然后,判断当前的sum加上当前元素是否大于等于0,如果是,则将当前元素加入sum中,并更新max的值。如果不是,则将sum重置为0,重新开始计算连续子数组的和。
  3. 最后,返回temp和max中的较大值。如果temp大于0,则说明数组中所有元素都是正数,此时max即为最大子数组的和;如果temp小于等于0,则说明数组中至少有一个负数,此时max可能为0,因此需要返回temp。
 public int FindGreatestSumOfSubArray(int[] array) {
     int sum = 0,max = 0;
     int temp = Integer.MIN_VALUE;
     for(int i = 0;i < array.length;i++){
         temp = Math.max(temp,array[i]);
         if(sum + array[i] >= 0){
             sum += array[i];
             max = Math.max(max,sum);
          }else {
              sum = 0;
         }
     }
        return temp > 0 ? max : temp;
 }

时间复杂度:O(n) 一层for循环

空间复杂度:O(1)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值