• 【每日训练】连续最大和


    目录

    题目链接:

    ​编辑测试用例:

    解析:

    程序:


    题目链接:

    连续最大和_牛客题霸_牛客网 (nowcoder.com)

    测试用例:

    解析:

    题目描述

            求一个数组中连续数(一个子数组)中最大的值。

    思路

            本题着力于子数组。子数组也就是此数组里任意的连续数据,此数组可以是1个数据也可以是多个数据。并且子数组也可以是本身。只要连续之和最大即可。

            因为是连续,所以最好想的就是以每个位置开始,分成不同的子段,每段累加进行比较,求得最大后转到下一个位置继续比较......这种虽然好想,但是时间复杂度O(N^2),效率低下。

                                                    

            那么能不能在只遍历一遍此数组的情况下(时间复杂度为O(N))达到求得其最大连续和呢?

            这个时候只有动态规划了。(动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。--百度百科)

            其实,从连续这个字眼我们可以扣出来。因为既然是求连续的,那么每次遍历时我把当前下标的值加上前一个下标的值,遍历到最后不就可以求的这个连续的数的和了吗。和是能求,但是现在是要求最大值。那么我们就可以在遍历的过程中规划一下路径,只要前一个不为负(为负的话前面的连续和已经小了,不需要加在新的数上,从此数开始就是一个新的子数组),我们就加上。然后每次在累加时记录下max,如果比max大就需要记录一下。这样遍历一遍的同时做到了求连续子数组的和。

         

     

    程序:

             如上分析所示,我们在遍历的时候可以直接对数组的值进行修改,达到记录当前子数组最大值的效果。但是如果原地修改数组的话,在不开辟新数组的空间前提下,下面程序分为了直接修改和不修改的版本,仅供参考~

    修改数组值:

    1. #include
    2. #include
    3. using namespace std;
    4. int isMax(vector<int>& v)
    5. {
    6. int max = v[0];
    7. for (int i = 1; i < v.size(); ++i)
    8. {
    9. if (v[i-1] > 0) v[i] += v[i - 1]; // 查看是否拖后腿,没拖后腿就继续连续,否则就分开到下一个连续数
    10. if (v[i] > max) max = v[i]; // 大就记录一下
    11. }
    12. return max;
    13. }
    14. int main()
    15. {
    16. int n;
    17. cin >> n;
    18. vector<int> v(n);
    19. for (int i = 0; i < v.size(); ++i)
    20. {
    21. cin >> v[i];
    22. }
    23. //动态规划-连续最大和
    24. cout << isMax(v) << endl;
    25. return 0;
    26. }

    不修改:

    1. #include
    2. #include
    3. using namespace std;
    4. int isMax(int a, int b)
    5. {
    6. return a > b ? a : b;
    7. }
    8. int main()
    9. {
    10. int n;
    11. cin >> n;
    12. vector<int> v(n);
    13. for (int i = 0; i < v.size(); ++i)
    14. {
    15. cin >> v[i];
    16. }
    17. //动态规划-连续最大和
    18. int max = v[0];
    19. int sum = v[0]; // 统计子数组的连续最大值
    20. for (int i = 1; i < v.size(); ++i) // 没有修改原数组的值
    21. {
    22. sum = isMax(sum + v[i], v[i]);
    23. if (sum > max) max = sum;
    24. }
    25. cout << max << endl;
    26. return 0;
    27. }

    嘿嘿,知道我要说什么了吧:______________!

     

  • 相关阅读:
    线性表——顺序表和链表
    17、Flink 之Table API: Table API 支持的操作(1)
    asp.net Core 中模拟微信公众号文件验证
    一个注解实现SpringBoot接口定制属性加解密
    curl (7) Failed connect to localhost8080; Connection refused
    如何使用django 结合websocket 进行实时目标检测呢?以yolov5 为例
    C# Winfrom 常用功能整合-1
    web前端期末大作业——贵州山地旅游介绍网页1页 HTML旅游网站设计与实现
    Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求
    IP包头分析
  • 原文地址:https://blog.csdn.net/weixin_61508423/article/details/127681663