CodeRookie


私信TA

用户名:Shmily124

访问量:133674

签 名:

清风前烹茶对弈,明月下把酒言欢

等  级
排  名 14
经  验 22985
参赛次数 7
文章发表 39
年  龄 0
在职情况 学生
学  校 ZUA
专  业 计科

  自我简介:

悄悄地秃头,然后惊艳所有人?

解题思路:

用滑动窗口思想解决问题比较简单,不过这题不需要记明窗口,只需要判断当前序列的和

只要当前序列的和不小于0,当前序列就有成为和最大的可能

如果当前序列和小于零,一定会使下一个序列的和变小

所以此时要刷新序列起点,即令和重置为0

在所有序列和中记下最大值即为所求答案

QQ截图20210303172207.png
参考代码:

#include <stdio.h>
 
int main()
{
    int n;                  //定义n
    scanf("%d", &n);        //输入n
    int num;
    int ans = 0;            //定义答案
    int sum = 0;            //定义序列和
    while (n--)             //循环n次
    {
        scanf("%d", &num);      //输入数字
        sum += num;             //加入序列和
        ans = (ans > sum) ? ans : sum;      //维持答案为最大
        if (sum < 0)    sum = 0;            //若序列和小于0,刷新为0
    }
    printf("%d\n", ans);        //输出答案
    return 0;
}


过一段时间又看看,发现代码还是有 bug 的,比如如果输入的数据都为负数,答案就会是 0

主要是 ans 的初始化 ( 为 0 ) 不合理

题目里说了数据范围  -10000  <=  A[i]  <= 10000 

那么可以给 ans 初始化为 -10001 ,也可以是 INT_MIN 或者 -0x3f3f3f3f

又或者先输入第一个数,把第一个输入的数作为ans 和 sum 的初始化

 

0.0分

14 人评分

  评论区

为啥我这样做只有50分
2022-10-15 16:43:30
6
2022-07-05 17:08:38
厉害啊
2022-03-06 10:01:52
知错能改,善莫大焉
2022-02-13 09:33:47
真的好厉害
2021-12-19 14:59:13
  • «
  • 1
  • »