题解 | #最大子段和#

最大子段和

https://www.nowcoder.com/practice/f04519cd1d904f50b68f4229a126ab08

题目链接

最大子段和

题目描述

给定一个长度为 的整数数组 。请你从中选取一个非空子数组(连续的一段),使得其元素之和最大。求出该最大和。

解题思路

本题是经典的动态规划问题,通常使用“Kadane算法”来高效解决。

我们定义 为以数组中第 个元素 结尾的连续子数组的最大和。我们的目标是求出所有 中的最大值。

对于第 个元素,以它结尾的最大和子数组有两种可能:

  1. 子数组只包含 这一个元素。
  2. 子数组是在以 结尾的最大和子数组后面,再接上 形成的。

因此,我们可以得到状态转移方程:

这个方程的含义是:以 结尾的最大子数组和,要么是 本身(这意味着开启一个新的子数组),要么是 加上前一个元素结尾的最大子数组和(这意味着延续之前的子数组)。

我们只需要一个变量来记录全局的最大和。在遍历数组计算每个 的同时,我们用一个全局最大值变量来更新和保留历史上的最大 值。

在实现时,可以发现计算 只需要 的值。因此,我们不需要一个完整的 数组,只需要一个变量来记录“当前结尾的最大和”即可,从而将空间复杂度优化到

代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;
    vector<long long> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    // current_max 相当于 dp[i],max_so_far 是全局最大值
    long long current_max = a[0];
    long long max_so_far = a[0];

    for (int i = 1; i < n; i++) {
        current_max = max(a[i], current_max + a[i]);
        max_so_far = max(max_so_far, current_max);
    }

    cout << max_so_far << "\n";

    return 0;
}
import java.util.Scanner;
import java.lang.Math;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] a = new long[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextLong();
        }

        // currentMax 相当于 dp[i],maxSoFar 是全局最大值
        long currentMax = a[0];
        long maxSoFar = a[0];

        for (int i = 1; i < n; i++) {
            currentMax = Math.max(a[i], currentMax + a[i]);
            maxSoFar = Math.max(maxSoFar, currentMax);
        }

        System.out.println(maxSoFar);
    }
}
n = int(input())
a = list(map(int, input().split()))

# current_max 相当于 dp[i],max_so_far 是全局最大值
current_max = a[0]
max_so_far = a[0]

for i in range(1, n):
    current_max = max(a[i], current_max + a[i])
    max_so_far = max(max_so_far, current_max)

print(max_so_far)

算法及复杂度

  • 算法:动态规划(Kadane算法)
  • 时间复杂度:,因为我们只需要对数组进行一次遍历。
  • 空间复杂度:,我们只使用了常数个额外变量来存储状态。
全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3&nbsp;投递、测评3.12&nbsp;笔试3.18&nbsp;一面3.25&nbsp;二面4.13&nbsp;ai面(hr面)4.14&nbsp;英语测评4.23&nbsp;offer(已拒)腾讯:2.6&nbsp;测评2.28&nbsp;wxg一面3.5&nbsp;wxg二面(挂)3.11&nbsp;teg一面3.21&nbsp;teg二面(取消)3.31&nbsp;teg一面4.10&nbsp;teg二面(挂)4.21&nbsp;wxg一面4.24&nbsp;wxg二面(挂)字节:1.28&nbsp;aml约面(取消)3.17&nbsp;火山一面(挂)4.8&nbsp;aml一面(挂)4.20&nbsp;抖音data一面(挂)阿里:3.23&nbsp;投递、测评3.28&nbsp;笔试3.31&nbsp;淘天一面4.8&nbsp;钉钉一面4.9&nbsp;淘天二面4.10&nbsp;阿里控股一面4.12&nbsp;钉钉二面(取消)4.15&nbsp;淘天hr面4.16&nbsp;淘天offer(已接)4.21&nbsp;高德一面(取消)4.22&nbsp;淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm&nbsp;api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
绿糖滑稽:携程这什么雷霆流程时长
我的求职进度条
点赞 评论 收藏
分享
评论
5
收藏
分享

全站热榜

更多

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务