开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第19天,点击查看活动详情。
最大子序和
描述
给定一个整数数组 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