leetcode-918. 环形子数组的最大和

题目

918. 环形子数组的最大和

解法

求两个值,一个是子数组最小值,一个是子数组最大值

环形数组如果没有跨最后一个那就是子数组最大值

如果跨了最后一个那就是 总数- 子数组最小值

为什么是 total-min ?

如果成环状,那么数组将被分成两段:头和尾

总数是不变的,如果其他部分加起来最大,那么中间的子数组必然加起来最小

class Solution {
    
    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function maxSubarraySumCircular($nums) {
        $len = count($nums);
        if ($len == 1) {
            return $nums[0];
        }
        
        $total = $min = $max = $currentMin = $currentMax = $nums[0];
        
        for ($i = 1; $i < $len; $i++) {
            $total += $nums[$i];
            $currentMax = max($currentMax + $nums[$i], $nums[$i]);
            $max = max($currentMax, $max);
            
            if ($i < $len - 1) {
                $currentMin = min($currentMin + $nums[$i], $nums[$i]);
                $min = min($currentMin, $min);
            }
        }
        
        return max($max, $total - $min);
    }
}

参考

官方题解
最小子数组方法

posted @ 2022-01-08 17:07  吴丹阳-V  阅读(72)  评论(0编辑  收藏  举报