给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

这个题目有东西的,解法很多,有很多需要注意的地方,是一个很值得学习的题目。

思路一:暴力求解法。即一个一个的遍历,直到找到最大值为止。比如从第一个数,开始,加一个,加两个,……再从第二个数开始,加一个,加两个,……。这种算法,算法复杂度很高,O(n^2),所以一般不采用,只作为入门

int maxSubArray(vector<int>& nums)
{
int max=nums[0],sum;
for(int i=0;i<nums.size();i++)
{
sum=0;
for(int j=i;j<nums.size();j++)
{
sum=sum+nums[j];
if(sum>max)
{
max=sum;
}
}
}
return max;
}

思路二:用一层循环,从头开始遍历,如果这个值本身,比前面得到的值加上它还要大,证明我不再需要前面的那些数了,我只需要从这个数开始往后寻找更大的和了。当然如果不是这样,就把这个值加上,继续遍历

int maxSubArray(vector<int>& nums)
{
int max=-INT_MAX,tmp=0;
for(int i=0;i<nums.size();++i)
{
tmp=(tmp+nums[i])>nums[i]?tmp+nums[i]:nums[i];
if(tmp>max)
max=tmp;
}
return max;
}

要注意的地方是,一开始最大值max的初始化,不能初始化为0,因为这样会把前面的一些负数和给屏蔽掉,导致结果不对,所以应该初始化为第一个值nums[0]或者INT_MIN

思路三,也是最佳思路,利用了分治的思想,

1)分--将原数组拆分成两部分,每个部分再拆分成新的两部分......直到数组被分得只剩下一个元素;
    2)治--每个小型的数组找最大子数组,只有一个元素的数组,解就是该元素;
    3)合--将两个小型数组合并为一个数组,其中解有三种可能:(1)左边的返回值大(2)右边的返回值大(3)中间存在一个更大的子数组和;
这三种可能性中,中间存在的更大的子数组和的实现是重点,做法是每次从中间元素开始向两边开始相加,直到找到最大的,然后将左边值与右边值加起来,就是中间存在的大的子数组和。
int findmiddle(vector<int>&nums,int left,int right,int middle)
{
int leftsum=nums[middle],rightsum=nums[middle+1];
int sum=0;
for(int i=middle;i>=left;i--)
{
sum+=nums[i];
if(leftsum<sum)
{
leftsum=sum;
}
}
sum=0;
for(int j=middle+1;j<=right;j++)
{
sum+=nums[j];
if(rightsum<sum)
{
rightsum=sum;
}
}
return (leftsum+rightsum);
}
int helper(vector<int>& nums,int left,int right)
{
if(left==right)
return nums[left];
int mid=(left+right)/2;
int l=helper(nums,left,mid);
int r=helper(nums,mid+1,right);
int m=findmiddle(nums,left,right,mid);
if ( l >= r && l >= m)
return l;
if ( r >= l && r >= m)
return r;
return m;
}
int maxSubArray(vector<int>& nums)
{
return helper(nums,0,nums.size()-1);
}

这段程序在实现的过程中,我认为需要注意的是findmiddle函数中的leftsum和rightsum中的初始化问题,不能用0初始化,因为如果都是负数的话,会造成干扰,也不能用INT_MIN初始化,因为返回值是两个数的和,如果有一个没有被计算到,那么会造成错误,所以要用其中的第一个数来初始化。个人见解。

 

Leetcode(53)-最大子序和的更多相关文章

  1. LeetCode 53. 最大子序和(Maximum Subarray)

    53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...

  2. Java实现 LeetCode 53 最大子序和

    53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 ...

  3. Leetcode——53.最大子序和

    @author: ZZQ @software: PyCharm @file: leetcode53_最大子序和.py @time: 2018/11/26 12:39 要求:给定一个整数数组 nums ...

  4. Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)

    Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...

  5. leetcode 120. 三角形最小路径和 及 53. 最大子序和

    三角形最小路径和 问题描述 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...

  6. 1. 线性DP 53. 最大子序和.

    53. 最大子序和. https://leetcode-cn.com/problems/maximum-subarray/ func maxSubArray(nums []int) int { dp ...

  7. 53. 最大子序和(剑指 Offer 42)

    53. 最大子序和(剑指 Offer 42) 知识点:数组:前缀和:哨兵:动态规划:贪心:分治: 题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求 ...

  8. 【LeetCode】53.最大子序和

    最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: ...

  9. Leetcode题目53.最大子序和(动态规划-简单)

    题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连 ...

  10. leetcode之53.最大子序和

    题目详情 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: ...

随机推荐

  1. [Poi2005]Piggy Banks小猪存钱罐

    题目描述 Byteazar有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar已经把每个存钱罐的钥匙放到了某些存钱罐里. Byteazar 现在想买一台汽车于是要把所有的钱都取 ...

  2. Navicat linux 官方最新版安装破解

    我们直接去官网下载linux版navicat 下载好之后执行命令打开软件 chmod +x navicat15-premium-cs.AppImage ./navicat15-premium-cs.A ...

  3. javascript判断浏览器访问,刷新,返回

    话不多说,直接上 if (window.performance.navigation.type === 0/* 正常访问 */) { // 你要干的事 } else if (window.perfor ...

  4. CSS3+JS完美实现放大镜模式

    最近看到一篇讲放大镜的文章,实践后感觉效果非常好,这里分享给大家. 效果如下: 其实现核心: CSS函数,如:calc() -- 动态计算:var() -- 使用自定义变量 CSS伪元素:::befo ...

  5. XShell下便捷上载/下载文件到虚拟机

    1.客户机联网后,安装 rz,sz 服务,命令如下: yum install lrzsz 2.XShell连接客户机: 2.1 上传文件:运行rz,在弹窗内选择Windows本地文件上传到客户机当前目 ...

  6. Python 2.x 和 Python 3.x

    Python 2.x 默认不支持中文,具体原因,等到介绍 字符编码 时给大家讲解 Python 2.x 的解释器名称是 python Python 3.x 的解释器名称是 python3 目前市场上有 ...

  7. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  8. java 将内容写入文件 txt

    @Test //将内容写入文件 public void xieru() throws Exception{ FileWriter fileWriter=new FileWriter("d:\ ...

  9. HPE 交换机基础配置

    1.交换机命名 (config)# hostname POE-SW 2.vlan创建及端口划分 1)端口加入vlan,两种方式 (config)# vlan 2 (vlan-2)# untagged ...

  10. 并发编程补充--方法interrupted、isinterrupted详解

    并发编程 interrupted()源码 /** * Tests whether the current thread has been interrupted. The * <i>int ...