算法设计课作业系列1——Maximum Subarray

来源:互联网 发布:服务器如何开放端口 编辑:程序博客网 时间:2024/06/05 22:41

算法设计课作业系列(1)

Maximum Subarray

题目展示

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

解题过程

参考网址

最大子数列问题-维基百科
清晰解题: 寻找最大子数列-Kadane算法

思路分析

这道题偏简单,由代码量就可以看出来,而由维基的介绍,涉及到Kadane算法,具体解释在给出的链接有详细说明,这里不再复述。
而根据算法,可以列下如下步骤:
1. 设一个变量max存储最大值,初始化为数组第一项
2. 初始化变量sum为0用于存储和,遍历数组,对于每一项,若加上值大于max,则设max为该sum值
3. 若sum小于0,则设sum为0
让我们来分析一下以上过程,初始时max为首项,sum为0。从第一项开始遍历,此时sum一定是等于max的值的,则继续;而继续往下操作时,若该项为负数,则sum一定不可能大于max的值,当sum减小到负数时,若不把sum设为0,则前面的负值则会影响到后面的结果,导致结果偏小;而既然前面的负值的sum无法对后面起到贡献作用,则干脆舍弃,重新算起。
继续看,对于遍历到的每个数,结果都是局部最优的,因为从第一项起,最大值就会被存储,而负值则会被舍弃,从而无法对后面的结果造成影响。
我们可以把让sum变成负值的那一项看作分界,后面就是一个新的子串,从而得到最大值。

源代码

代码过于短小,且上面也有较为详细的解题思路,这里不再添加注释,因为最好的注释就是没有注释,只要从代码就可以看出编写者的思路。

#include<Vector>using namespace std;class Solution {public:    int maxSubArray(vector<int>& nums) {        int sum = 0;        int max = nums[0];        for (int i = 0; i < nums.size(); i++) {            sum += nums[i];            if (sum > max) {                max = sum;            }            if (sum < 0) {                sum = 0;                continue;            }        }        return max;    }};
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 换工作了报到证怎么办 幼儿园的孩子不写作业怎么办 幼儿园宝宝不写作业怎么办 幼儿园孩子不写作业怎么办 光盘数据面写字了怎么办 娃娃的手断了怎么办 联币金融跑路了怎么办 胃消化不了想吐怎么办 吃撑了恶心想吐怎么办 mac口红膏体晃动怎么办 excl图标和以前不一样了怎么办 冰箱显示板坏了怎么办 冰箱电脑显示屏坏了怎么办 冰箱的电子显示屏坏了怎么办 指导别人炒股亏损了怎么办 没有协议委托别人炒股亏损怎么办 炒股亏了很多钱崩溃了怎么办 帮人炒股亏了很多钱怎么办 破净买入继续跌怎么办 国画颜色上错了怎么办 宝宝5个月脸一直开裂怎么办 宝宝冻脸怎么办小妙招 3岁小儿长期便秘怎么办 脚裂了怎么办小妙招 宝宝脸风吹裂了怎么办 宝宝脸被风吹裂了怎么办 小宝贝的手有时候抖怎么办 打球把手戳肿了怎么办 阴茎上皮肤皴了怎么办 手皮肤干燥起皮怎么办 一到冬天手脚冰凉怎么办 脸上的皮肤被搓掉了怎么办 皮肤的表皮搓掉了怎么办 固体水彩经常掉出来怎么办 画水彩纸皱了怎么办 画完水彩纸皱了怎么办 旗袍后面隐形拉链气包怎么办 电动缝纫机不往前走怎么办 衬衣领子磨烂了怎么办 白寸衣领变黄怎么办 黑衣领衣服洗发黄怎么办