贺胖娇的编程之旅......

53.最大子序和

2021.08.31

题目链接:53.最大子序和

题目描述

难度 简单 描述 给定一个整数数组 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

提示: 1 <= nums.length <= 3 * 104 -105 <= nums[i] <= 105

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

自行解法

一开始并没有想到合适的解法,于是想到最暴力的方式,获取所有子序和并比较

class Solution {
    /**
     * 出所有的子序和之后进行比较
     * @param Integer[] $nums
     * @return Integer
     */
    function maxSubArray($nums) {
        $maxForI = [];
        for ($i = 0; $i < count($nums); $i++) {
            $sumForI = $nums[$i];
            $maxForJ = [];
            $max = max($nums);
            for ($j = $i + 1; $j < count($nums); $j++) {
                if ($i == $j) {
                    $sumForI = $nums[$i];
                } else {
                    $sumForI += $nums[$j];
                }
                $maxForJ[] = max($maxNum, $sumForI, $max);
                $maxNum = $sumForI;
            }
            if (count($nums) == 1) {
                $maxForJ = $nums;
            }
            $maxForI[$i] = max($maxForJ);
        }
        return max($maxForI);
    }
}

这种方式可以通过绝大部分测试用例,但是当$nums增加到一定数量级后会超时

其他解法

经过查阅资料,发现这里会有更好的解法

class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function maxSubArray($nums) {
        $res = $nums[0];
        $sum = 0;
        foreach ($nums as $num) {
            if ($sum > 0) {
                $sum += $num;
            } else {
                $sum = $num;
            }
            $res = max($res, $sum);           
        }
        return $res;
    }
}
发表评论