Leetcode53. 最大子序列和
问题
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
代码
贪心算法
核心思想就是检查之前 i-1 的元素和,如果小于零就舍弃——对应下面第六行代码
1 class Solution {
2 public:
3 int maxSubArray(vector<int>& nums) {
4 int cur_nums = 0 , max_nums = INT_MIN;
5 for(int i = 0;i < nums.size();i++){
6 cur_nums = max(nums[i],cur_nums + nums[i]);
7 max_nums = max(cur_nums,max_nums);
8 }
9 return max_nums;
10 }
11 };
动态规划
关于动态转移方程建立的分析如下:

摘自 https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/
1 class Solution {
2 public:
3 int maxSubArray(vector<int>& nums) {
4
5 int max_sum = nums[0];
6 vector<int> dp (nums.size());
7 dp[0] = nums[0];
8 for(int i = 1 ;i < dp.size(); i++){
9 dp[i] = max(dp[i-1] + nums[i], nums[i]);
10 max_sum = max(max_sum,dp[i]);
11 }
12 return max_sum;
13 }
14 };
上面时间复杂度为O(n),空间复杂度为O(n) 但是这题从动态转移方程可以看出dp[i] 只依赖于前面 dp[i-1] 。
所以可以不使用数组来保存dp,用int变量来保存。 这样得到优化后的空间复杂度为O(1)的代码如下
1 class Solution {
2 public:
3 int maxSubArray(vector<int>& nums) {
4
5 int max_sum = nums[0];
6 int dp = nums[0];
7 for(int i = 1 ;i < nums.size(); i++){
8 dp = max(dp + nums[i], nums[i]);
9 max_sum = max(max_sum,dp);
10 }
11 return max_sum;
12 }
13 };
Leetcode53. 最大子序列和的更多相关文章
- LeetCode53 最大子序列问题
题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], ...
- LeetCode--53 最大连续子序列(总结)
# 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. # 示例:# 输入: [-2,1,-3,4,-1,2,1,-5,4],# 输出: 6# 解释 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列
A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...
- [LeetCode] Is Subsequence 是子序列
Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...
- [LeetCode] Wiggle Subsequence 摆动子序列
A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...
- [LeetCode] Increasing Triplet Subsequence 递增的三元子序列
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- [LeetCode] Distinct Subsequences 不同的子序列
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
随机推荐
- 【涂鸦物联网足迹】用煲仔饭来说明IaaS/PaaS/SaaS的区别
最近在准备一些科普性的知识内容,发现大家对于一些基础性的知识概念还是有点模糊.今天先来简单介绍一下IaaS/PaaS/SaaS的区别~ 其实还有一个On-Premises(本地部署)的概念,也可以一并 ...
- Spark性能调优篇八之shuffle调优
1 task的内存缓冲调节参数 2 reduce端聚合内存占比 spark.shuffle.file.buffer map task的内存缓冲调节参数,默认是3 ...
- 关于AES-CBC模式字节翻转攻击(python3)
# coding:utf-8 from Crypto.Cipher import AES import base64 def encrypt(iv, plaintext): if len(plaint ...
- 第七章 Rocketmq--消息驱动
今天咱们接着 上一篇第六章 Sleuth–链路追踪 继续写 SpringCloud Alibaba全家桶 , 第七章 Rocketmq--消息驱动,废话不多说,开始了 7.1 MQ简介 7.1.1 什 ...
- Redisearch实现的全文检索功能服务
"检索"是很多产品中无法绕开的一个功能模块,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海量数据和高并发的时候,业界常用 elasticsearch 和 lucene ...
- HTTP Error 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。
将submit改成button即可 因为触发了form表单
- windows使用git bash 无法交互键盘上下键移动选择选项的解决方法
目录 遇到的问题 解决方案 1. 直接通过数字键来选择 2. 使用 winpty 来启动命令 3. 将 git bash 换成 cmd 4. 使用vscode中是bash 遇到的问题 windows使 ...
- flowable获取上级主管
//主管 Dept managerDept = deptUserUtil.getManagerDept(bean.getCreateDept(),bean.getCreateUser()); //上级 ...
- h5问题总结
一.下拉刷新上拉加载 主要依赖一款插件mescroll.js http://www.mescroll.com/ 简单好用.以前同事的用法是初始化执行执行上拉会调,页数从0开始,下拉重新加载当前地址走 ...
- 看完这篇,保证让你真正明白:分布式系统的CAP理论、CAP如何三选二
引言 CAP 理论,相信很多人都听过,它是指: 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance) ...