LintCode: Maximum Subarray

简介:

1. 暴力枚举

2. “聪明”枚举

3. 分治法

分:两个基本等长的子数组,分别求解T(n/2)

合:跨中心点的最大子数组合(枚举)O(n)

时间复杂度:O(n*logn)

复制代码
 1 class Solution {
 2 public:    
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A integer indicate the sum of max subarray
 6      */
 7     int maxSubArray(vector<int> nums) {
 8         // write your code here
 9         int size = nums.size();
10         if (size == 1) {
11             return nums[0];
12         }
13         int *data = nums.data();
14         return helper(data, size);
15     }
16     int helper(int *data, int n) {
17         if ( n == 1) {
18             return data[0];
19         }
20         int mid = n >> 1;
21         int ans = max(helper(data, mid), helper(data + mid, n - mid));
22         int now = data[mid - 1], may = now;
23         for (int i = mid - 2; i >= 0; i--) {
24             may = max(may, now += data[i]);
25         }
26         now = may;
27         for (int i = mid; i < n; i++) {
28             may = max(may, now += data[i]);
29         }
30         return max(ans, may);
31     }
32 };
复制代码

 

4. dp(不枚举子数组,枚举方案)

dp[i]表示以a[i]结尾的最大子数组的和

dp[i] = max(dp[i-1]+a[i], a[i])

  包含a[i-1]:dp[i-1]+a[i]

  不包含a[i-1]:a[i]

初值:dp[0] = a[0]

答案:最大的dp[0...n-1]

时间:O(n)

空间:O(n)

空间优化:dp[i]要存吗?

  endHere = max(endHere+a[i], a[i])

  answer = max(endHere, answer)

优化后的空间:O(1)

复制代码
 1 class Solution {
 2 public:    
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A integer indicate the sum of max subarray
 6      */
 7     int maxSubArray(vector<int> nums) {
 8         // write your code here
 9         int size = nums.size();
10         if (size == 1) {
11             return nums[0];
12         }
13         vector<int> dp(size);
14         dp[0] = nums[0];
15         int ans = dp[0];
16         for (int i=1; i<size; i++) {
17             dp[i] = max(dp[i - 1] + nums[i], nums[i]);
18             ans = max(ans, dp[i]);
19         }
20         return ans;
21     }
22 };
复制代码

空间优化

复制代码
 1 class Solution {
 2 public:    
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A integer indicate the sum of max subarray
 6      */
 7     int maxSubArray(vector<int> nums) {
 8         // write your code here
 9         int size = nums.size();
10         if (size == 1) {
11             return nums[0];
12         }
13         int endHere = nums[0];
14         int ans = nums[0];
15         for (int i=1; i<size; i++) {
16             endHere = max(endHere + nums[i], nums[i]);
17             ans = max(ans, endHere);
18         }
19         return ans;
20     }
21 };
复制代码

 

5. 另外一种线性枚举

定义:sum[i] = a[0] + a[1] + a[2] + ... + a[i]  i>=0

     sum[-1] = 0

则对0<=i<=j:

  a[i] + a[i+1] + ... + a[j] = sum[j] - sum[i-1]

我们就是要求这样一个最大值:

  对j我们可以求得当前的sum[j],取的i-1一定是之前最小的sum值,用一个变量记录sum的最小值

  时间:O(n)

  空间:O(1)

复制代码
 1 class Solution {
 2 public:    
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A integer indicate the sum of max subarray
 6      */
 7     int maxSubArray(vector<int> nums) {
 8         // write your code here
 9         int size = nums.size();
10         if (size == 1) {
11             return nums[0];
12         }
13         int sum = nums[0];
14         int minSum = min(0, sum);
15         int ans = nums[0];
16         for (int i = 1; i < size; ++i) {
17             sum += nums[i];
18             ans = max(ans, sum - minSum);
19             minSum = min(minSum, sum);
20         }
21         return ans;
22     }
23 };
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5006447.html,如需转载请自行联系原作者

相关文章
|
大数据 数据管理 Docker
【Datahub系列教程】Datahub入门必学——DatahubCLI之Docker命令详解
【Datahub系列教程】Datahub入门必学——DatahubCLI之Docker命令详解
956 0
|
12月前
|
NoSQL 关系型数据库 MongoDB
Django与MongoDB搭建高效的Web应用
Django与MongoDB搭建高效的Web应用
319 1
|
10月前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 优化与性能提升
本文介绍了 GraphQL API 的常见性能问题及优化方法,包括解决 N+1 查询问题、避免过度取数据、合理使用缓存及优化解析器性能,提供了 C# 实现示例。
190 33
|
10月前
|
存储 持续交付 数据中心
《 Docker 的基本概念和优势,以及在应用程序开发中的实际应用》
Docker是开源容器化平台,使开发者能将应用及其依赖打包成容器,在任何支持Docker的环境中部署。其核心包括:Docker镜像(含应用及依赖)、Docker容器(运行实例)和Docker仓库(存储共享镜像)。Docker的优势在于快速部署、资源隔离、灵活性及可移植性,广泛应用于开发测试、跨平台部署、弹性扩展及持续集成等领域。
175 0
|
存储 数据可视化 数据安全/隐私保护
Docker Registry本地私有仓库搭建
Docker Registry本地私有仓库搭建
955 0
|
SQL 安全 关系型数据库
[SWPUCTF 2021 新生赛]easy_sql
[SWPUCTF 2021 新生赛]easy_sql
509 0
|
Java 应用服务中间件 API
一小时学会使用springboot操作阿里云OSS实现文件上传,下载,删除(附源码)
一小时学会使用springboot操作阿里云OSS实现文件上传,下载,删除(附源码)
一小时学会使用springboot操作阿里云OSS实现文件上传,下载,删除(附源码)
西门子S7-1200 CPU型号及模块类型有哪些
上篇文章我们介绍了西门子S7-1200功能特点及应用范围有哪些,今天我为大家简单介绍一下西门子S7-1200的CPU型号及模块类型。西门子S7-1200作为紧凑型自动化产品的新成员,目前有三款CPU,分别是CPU1211C、CPU1212C和CPU1214C。根据电源和输入输出信号的不同,每款CPU各有三种不同的型号,不同型号的CPU,本机自带输入输出数字量的点数有所差异。CPU1211C不支持信号扩展模块,而CPU1212C支持两个,CPU1214C最多支持八个。
西门子S7-1200 CPU型号及模块类型有哪些
|
机器学习/深度学习 Web App开发 弹性计算
Serverless 架构下的 AI 应用开发:入门、实战与性能优化
本章通过对 Serverless 架构概念的探索,对 Serverless 架构的优势与价值、挑战与困境进行分析,以及 Serverless 架构应用场景的分享,为读者介绍 Serverless 架构的基础内容。通过本章的学习,读者将对 Serverless 架构的理论基础有一定的了解和认识。
Serverless 架构下的 AI 应用开发:入门、实战与性能优化
element-ui:el-autocomplete实现滚动触底翻页
element-ui:el-autocomplete实现滚动触底翻页
502 0
element-ui:el-autocomplete实现滚动触底翻页