算法学习-Leetcode(三)—— 最大子序和


前言

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
尝试了一下,只解决了部分示例,没完全解决,后面看了官方的题解,官方给了动态规划和分治,分治看的有点迷糊,但是大概意思是明白了,后面再研究研究,本文主要介绍动态规划解法。


一、方法一:暴力法

找出数组中所有可能的子序列,然后找出子序列中和最大的,这个工程太庞大了,但是确实最容易想到了,这里就不贴代码了,遍历求和就行。

二、动态分配

思路和暴力法差不多,但是每次在两个子序列中求出最大的,遍历数组后,剩下的就是最大子序列之和了。

代码如下(示例):

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
          if(nums.size()<2)return nums[0];
          //maxArray = nums[0],如果maxArray =0,将使存在负数的数组出现最大值为零的情况。
          int pre=0,maxArray = nums[0];
         for(auto x:nums){
           //1、max(pre+x,x)=x,则pre存储为新开子序列第一个值
           //2、max(pre+x,x)=pre+x,则pre存储为前一个子序列sum
            pre = max(pre+x,x);
           //3、max(maxArray,pre)=pre,则maxArray被新的子序列之和替代
           //4、max(maxArray,pre)=maxArray,则maxArray仍为前一个子序列之和
            maxArray = max(maxArray,pre);
        }

              return maxArray;
    } 
        
};

更多题解请前往leetCode官网最大子序列题解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值