题目

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

题解

方法1:暴力法

算法

暴力地用两重循环遍历所有情况

代码

class Solution {public:int maxSubArray(vector<int>& nums) {int n = nums.size();int max = nums[0];for (int i = 0; i < n; i++) {int sum = 0;for (int j = i; j < n; j++) {sum += nums[j];if (sum > max)max = sum;}}return max;}
};
  • 通过使用int n = nums.size()可以提高一点速度,从580ms到420ms,由此看出循环里使用vectorsize()函数是非常不明智的。

分析

  • 时间复杂度:O(n2)O(n^2)O(n2),循环次数为n(n−1)2\frac {n(n-1)}{2}2n(n−1)​。
  • 空间复杂度:O(1)O(1)O(1),只用了两个变量。
  • LeetCode排名:8.66%

方法2:分治法

算法

代码

class Solution {public:int CrossSum(vector<int>& nums, int left, int right, int middle) {if(left == right)return nums[left];int left_sum = nums[middle];int t = 0;for (int i = middle; i >= left; i--) {t += nums[i];if (t > left_sum)left_sum = t;}int right_sum = nums[middle + 1];t = 0;for (int i = middle + 1; i <= right; i++) {t += nums[i];if (t > right_sum)right_sum = t;}return left_sum + right_sum;}int MaxSub(vector<int>& nums, int left, int right) {if (left == right)return nums[left];int middle = (left + right) / 2;int left_sum = MaxSub(nums, left, middle);int right_sum = MaxSub(nums, middle + 1, right);int cross_sum = CrossSum(nums, left, right, middle);int t = left_sum > right_sum ? left_sum : right_sum;return t > cross_sum ? t : cross_sum;}int maxSubArray(vector<int>& nums) {return MaxSub(nums, 0, nums.size() - 1);}
};

分析

  • 时间复杂度:O(NlogN)O(NlogN)O(NlogN)。
  • 空间复杂度:O(N)O(N)O(N),递归时使用线性空间。
  • LeetCode排名:81.72%

方法3:动态规划

算法

代码

class Solution {public:int maxSubArray(vector<int>& nums) {int max = nums[0];int n = nums.size();for (int i = 1; i < n; i++) {if (nums[i - 1] > 0)nums[i] += nums[i - 1];if (nums[i] > max)max = nums[i];}return max;}
};

分析

  • 时间复杂度:O(N)O(N)O(N),只遍历一遍。
  • 空间复杂度:O(1)O(1)O(1),算法使用常数空间。
  • LeetCode排名:98.37%98.37\%98.37%,不过每次提交都会不一样,有时98%98\%98%,有时20%20\%20%,故只当作一个参考。

【LeetCode】53.最大子序和相关推荐

  1. leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法

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

  2. leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别

    这两道算法题的解题思路是差不多的,但是从整体上分析,乘积最大子序列之和是最大子序和的进阶.先来看看两道算法题的简单描述. 53.最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组 ...

  3. leetcode - 53. 最大子序和

    53. 最大子序和 - 动态规划 -------------------------------------- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素), ...

  4. LeetCode 53. 最大子序和(动态规划)

    文章目录 1. 题目描述 2. 解题 2.1 暴力求解 2.2 动态规划 1. 题目描述 题目链接:https://leetcode-cn.com/problems/maximum-subarray/ ...

  5. LeetCode 53:最大子序和解题以及优化思路(第一次独立刷题记录)

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

  6. LeetCode 53最大子序和

    力扣 思路: 「连续」是关键字,连续很重要,不是子序列. 动态规划 详细解答请参考力扣 定义dp数组:        dp [i] 表示以nums[i]结尾的最大连续子数组的和 状态转移方程:    ...

  7. leetcode 53.最大子序和

    难度:简单 频率:159 题目 给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 解题思路 :动态规划(贪心) 解题方法: 1.对数组进行遍历 2.有 ...

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

    第一次提交成功 class Solution { public:int maxSubArray(vector<int>& nums) {if (nums.size() == 1) ...

  9. leetcode 53. 最大子序和(C语言)

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

  10. [leetcode] 53.最大子序和

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

最新文章

  1. Chrome开发者工具详解(2)-Network面板
  2. Python 列表和元组
  3. 从github下载项目并导入eclipse
  4. struts2错误:The Struts dispatcher cannot be found.
  5. spark内核揭秘-06-TaskSceduler启动源码解析初体验
  6. 开始VC6学习之旅2
  7. info matlab,c – 在OpenCV中是否有类似MATLAB的’impixelinfo()’功能?
  8. android p ify 三星,Enjarify - Android逆向(二)
  9. 基于信息熵确立权重的topsis法_基于信息熵和TOPSIS法的装备战场抢修排序决策模型...
  10. java怎么打不开vos_JAVA如何调用VOS2009接口
  11. Java IO流笔记4 --- File类
  12. web打印三种实现方式
  13. 【带书签】零基础学SQL.pdf(孙浏毅 等著) 下载
  14. mysql recordcount_Filter 和 RecordCount 属性示例 (VB)
  15. openGL绘制带纹理地球,并实现鼠标键盘控制
  16. html5 spin,HTML5 number spinbox controls not triggering a cha
  17. 怎么调大计算机浏览器内字体,浏览器字体大小怎么设置,教你浏览器字体大小怎么设置-win7旗舰版...
  18. 错误代码: SEC_ERROR_REUSED_ISSUER_AND_SERIAL(解决办法)
  19. 区块链教程之以太坊开发连接主网和测试网
  20. 2019.4.11 一题 XSY 1551 ——广义后缀数组(trie上后缀数组)

热门文章

  1. CCS5.5里DSP工程建及Simulator模式配置
  2. 从源码分析DEARGUI之异步传参
  3. .NET Core IdentityServer4实战-开篇介绍与规划
  4. 微信公众号开发之微信JSSDK
  5. Oracle基本操作(二)
  6. Mac OS X 10.10, Eclipse+ADT真机调试代码时,Device Chooser中不显示真机的解决方式
  7. 面试常备题---链表总结篇
  8. Ubuntu14.04安装JDK
  9. 通过变长数组(VLA)来看编译器的不同
  10. 使用Spring+CXF开发WebService