题解 | #连续子数组最大和#

连续子数组最大和

https://www.nowcoder.com/practice/03d341fb6c9d42debcdd38d82a0a545c

解题思路

这是一道经典的动态规划问题,也可以用贪心算法解决。主要思路如下:

  1. 维护两个变量:

    • : 当前连续子数组的和
    • : 已找到的最大连续子数组和
  2. 遍历数组时:

    • 累加当前元素到
    • 如果 ,重置 (放弃之前的子数组)
    • 如果 ,更新
  3. 特殊情况:

    • 如果所有数都是负数,返回最大的负数
    • 初始化 来处理全负数的情况

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    int sum = -1, temp = 0;
    
    for(int i = 0; i < N; i++) {
        int num;
        cin >> num;
        temp += num;
        
        // 如果当前和为负,放弃之前的子数组
        if(temp < 0) {
            temp = 0;
        }
        else {
            sum = max(sum, temp);
        }
    }
    
    cout << sum << endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int sum = -1, temp = 0;
        
        for(int i = 0; i < N; i++) {
            int num = sc.nextInt();
            temp += num;
            
            if(temp < 0) {
                temp = 0;
            }
            else {
                sum = Math.max(sum, temp);
            }
        }
        
        System.out.println(sum);
    }
}
n = int(input())

sum_max = -1
temp = 0

for _ in range(n):
    num = int(input())
    temp += num
    
    if temp < 0:
        temp = 0
    else:
        sum_max = max(sum_max, temp)

print(sum_max)

算法及复杂度

  • 算法:动态规划/贪心
  • 时间复杂度: - 只需要遍历一次数组
  • 空间复杂度: - 只需要两个变量存储状态
全部评论

相关推荐

佛系的本杰明反对画饼:个人看法,实习经历那段是败笔,可以删掉,它和你目标岗位没什么关系,没有用到什么专业技能,甚至会降低你项目经历内容的可信度。个人技能那里可以再多写一点,去boss直聘上看别人写的岗位要求,可以把你会的整合一下,比如熟悉常规的开关电源拓扑结构(BUCK、正激、反激、LLC等),熟悉常用的通信总线协议和通信接口,如UART,IIC,SPI等。简历首先是HR看的,HR大多不懂技术,会从简历里去找关键字,你没有那些关键字他可能就把你筛掉了,所以个人技能尽量针对着岗位描述写一下。还有电赛获佳绩,获奖了就写什么奖,没获奖就把获佳绩删了吧,要不会让人感觉夸大。
点赞 评论 收藏
分享
04-25 18:13
五邑大学 Java
无面如何呢:用心包装一下自己的实习
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务