【LeetCode】最大子序和

80 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第19天,点击查看活动详情

最大子序和

原题:leetcode-cn.com/problems/ma…

描述

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

难度

简答

示例

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

思路

将问题理解成求第 i 个元素结尾的最大和,可以使用动态规划算法。用 maxArray[i] 代表以第 i 个元素结尾的「连续子数组的最大和」,那么最大和就是 max(maxArray[i])。

因此只要求出每个元素的最大和即可,如何求第 i 个元素结尾的最大和?求第 i 个元素结尾的最大和,取决于 maxArray[i - 1] + nums[i] 和 nums[i],就是求 maxArray[i - 1] + nums[i] 和 nums[i] 的最大值。

循环求出所有的 maxArray[i],记最大和为 maxValue,每次循环比较 maxArray[i] 和 maxValue,修改 maxValue 的值,最后返回 maxValue。

代码

Rust

pub struct Solution {}
​
impl Solution {
    pub fn max_sub_array(nums: Vec<i32>) -> i32 {
        // 记录以每个元素结尾的最大值数组
        let mut max_array = vec![0; nums.len()];
        // 第一个元结尾的最大值
        max_array[0] = nums[0];
        // 初始化最大值
        let mut max_value = nums[0];
        for i in 1..nums.len() {
            max_array[i] = nums[i];
            // 前一个元素结尾的最大值
            if max_array[i - 1] + nums[i] > nums[i] {
                max_array[i] += max_array[i - 1];
            }
            // 判断最大值
            if max_array[i] > max_value {
                max_value = max_array[i];
            }
        }
        max_value
    }
}
#[test]
fn test_max_sub_array() {
    let nums = vec![-2, 1, -3, 4, -1, 2, 1, -5, 4];
    println!("{:?}", nums);
​
    let value = Solution::max_sub_array(nums);
    println!("{}", value);
}

运行结果:

[-2, 1, -3, 4, -1, 2, 1, -5, 4]
6

Go

func maxSubArray(nums []int) int {
    // 记录以每个元素结尾的最大值数组
    maxArray := make([]int, len(nums))
    // 第一个元结尾的最大值
    maxArray[0] = nums[0]
    // 初始化最大值
    maxValue := nums[0]
    for i := 1; i < len(nums); i++ {
        maxArray[i] = nums[i]
        // 前一个元素结尾的最大值
        if maxArray[i - 1] + nums[i] > nums[i] {
            maxArray[i] += maxArray[i - 1]
        }
        // 判断最大值
        if maxArray[i] > maxValue {
            maxValue = maxArray[i]
        }
    }
    return maxValue
}
func TestMaxSubArray(t *testing.T) {
    nums := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4}
    t.Log(nums)
​
    value := maxSubArray(nums)
    t.Log(value)
}

运行结果:

[-2 1 -3 4 -1 2 1 -5 4]
6

Java

public class Main {
​
    public static int maxSubArray(int[] nums) {
        // 记录以每个元素结尾的最大值数组
        int[] maxArray = new int[nums.length];
        // 第一个元结尾的最大值
        maxArray[0] = nums[0];
        // 初始化最大值
        int maxValue = nums[0];
        for (int i = 1; i < nums.length; i++) {
            maxArray[i] = nums[i];
            // 前一个元素结尾的最大值
            if (maxArray[i - 1] + nums[i] > nums[i]) {
                maxArray[i] += maxArray[i - 1];
            }
            // 判断最大值
            if (maxArray[i] > maxValue) {
                maxValue = maxArray[i];
            }
        }
        return maxValue;
    }
​
    public static void main(String[] args) {
        int[] nums = new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4};
        System.out.println(Arrays.toString(nums));
​
        int value = maxSubArray(nums);
        System.out.println(value);
    }
}

运行结果:

[-2, 1, -3, 4, -1, 2, 1, -5, 4]
6