华为OD面试手撕算法-最大子数组和

题目描述

本题是leetcode原题(中等难度):最大子数组和

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

子数组是数组中的一个连续部分。

思路分析

动态规划 】当前位置的子数组最大和可以由前一个位置的结果推理出来,即当前状态可由上一个状态推出,对于这一类问题,我们都可以考虑使用动态规划来解决【墙推Carl哥的代码随想录】。

DP五部曲分析:

1)确定dp数组的下标及含义:dpi表示以numsi结尾的连续子数组最大和

2)确定递推公式:当前位置的值只能由前一个位置dpi-1推出。对于dpi-1,我们有两种选择:

① 若dpi-1 < 0:表示前i-1个元素的最大子数组和小于0,说明其对当前位置的结果有负面作用,我们选择抛弃,从当前位置重新开始,此时dpi = numsi

② 若dpi-1>=0: 表示前i-1个元素的最大子数组和大于等于0,说明对当前位置结果有正向作用,我们选择接纳,此时dpi = dpi-1 + numsi

故递推公式为dpi = max(numsi,dpi-1+numsi)

  1. 初始化dp:第一个位置的最大子数组和即为本身,故dp0 = nums0,其余元素均初始为0;

4)确定遍历顺序:dpi 是由dpi-1推出的,故遍历顺序为从前向后

5)举例验证dp过程

因为我们要求的是全局最大和,所以dp遍历过程中,应该用一个全局遍历记录最大值maxSum,最后返回maxSum。

代码实现

Go 复制代码
func maxSubArray(nums []int) int {
    maxSum := nums[0]
    dp := make([]int,len(nums))
    //dp初始化
    dp[0] = nums[0]
    for i := 1;i < len(nums);i++{
        dp[i] = maxVal(nums[i],dp[i-1]+nums[i])
        maxSum = maxVal(maxSum,dp[i])
    }
    return maxSum
}

func maxVal(a,b int) int{
    if a > b {
        return a
    }
    return b
}
相关推荐
liang_jy3 小时前
文件管理(四)—— 文件存储空间管理
面试·操作系统
liang_jy4 小时前
文件管理(三)—— 文件目录
面试·操作系统
拳里剑气6 小时前
C++算法:BFS解决FloodFill算法
c++·算法·bfs·宽度优先
wanderist.7 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
稚南城才子,乌衣巷风流8 小时前
支配树(Dominator Tree)详解:概念、算法与应用
算法
稚南城才子,乌衣巷风流8 小时前
动态开点:原理、实现与应用场景
数据结构·算法
yyds_yyd_100868 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode
feng尘9 小时前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试
KaMeidebaby9 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法