1. 题目

1.1 英文题目

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

1.2 中文题目

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

1.3输入输出

输入 输出
nums = [-2,1,-3,4,-1,2,1,-5,4] 6
nums = [1] 1
nums = [5,4,-1,7,8] 23

1.4 约束条件

  • 1 <= nums.length <= 3 * 104
  • -105 <= nums[i] <= 105

2. 实验平台

IDE:VS2019

IDE版本:16.10.1

语言:c++11

3. 程序

3.1 测试程序

#include "Solution.h"
#include <vector> // std::vector
#include<iostream> // std::cout
using namespace std; // 主程序
void main()
{
// 输入
vector<int> nums = { -100000 }; Solution solution; // 实例化Solution
int k = solution.maxSubArray(nums); // 主功能 // 输出
cout << k << endl;
}

3.2 功能程序

3.2.1 穷举遍历法

(1)代码

#pragma once
#include<vector> // std::vector
using namespace std; //主功能
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 暴力求解
int maxValue = -100000;
for (int i = 0; i < nums.size(); i++) //遍历起始值
{
int nowSub = 0;
for (int j = i; j < nums.size(); j++) // 全部遍历一遍
{
nowSub += nums[j];
if (nowSub > maxValue) maxValue = nowSub;
}
}
return maxValue;
}
};

(2)解读

该方法是最容易想到的方法,暴力求解,运用滑动窗口法进行遍历,分别得到以某个为开头的序列进行求最大值,并随遍历的进行实时更新该最大值。复杂度为O(\(n^2\))。

3.2.2 动态规划法

(1)代码

#pragma once
#include<vector> // std::vector
using namespace std; //主功能
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 动态规划(时间复杂度O(n),空间复杂度O(n))
int length = nums.size();
vector<int> dp(length); // 存储每次递归的最大值
dp[0] = nums[0];
for (int i = 1; i < length; i++)
dp[i] = max(dp[i - 1] + nums[i], nums[i], [](int a, int b) {return a > b ? a : b; }); // Lamda表达式 //求dp中的最大值
int maxSub = -100000;
for (auto j : dp) // c++11中基于范围的for循环(Range-based for loop)
if (maxSub < j)
dp[j] = maxSub;
return maxSub;
}
};

(2)思路

参考:https://zhuanlan.zhihu.com/p/85188269

3.2.3 kadane算法

(1)代码

#pragma once
#include<vector> // std::vector
using namespace std; //主功能
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// kadane算法(时间复杂度O(n),空间复杂度O(1))
int length = nums.size();
int maxSub = nums[0]; // 慢指针
int maxSubTemp = nums[0]; //快指针
for (auto i : nums)
{
maxSubTemp = max(maxSubTemp + nums[i], nums[i], [](int a, int b) {return a > b ? a : b; }); // Lamda表达式
if (maxSubTemp > maxSub) // 若当前最大值大于总最大值,则总最大值更新
maxSub = maxSubTemp;
}
return maxSub;
}
};

(2)解读

kadane算法是在动态规划法的基础上加上快慢指针法,快指针指向以i为结尾的子数组最大值之和,慢指针指向迄今为止的子数组最大值之和

3.3.4 分治法(divide and conquer)

(1)代码

pragma once

include // std::vector

//#include<limits.h> // INT_MIN整型最小值

include // std::max

using namespace std;

//主功能

class Solution {

public:

int maxSubArray(vector& nums) {

if (nums.empty()) return 0;

return helper(nums, 0, (int)nums.size() - 1);

}

int helper(vector& nums, int left, int right)

{

if (left >= right) return nums[left];

int mid = left + (right - left) / 2;

int lmax = helper(nums, left, mid - 1);

int rmax = helper(nums, mid + 1, right);

int mmax = nums[mid], t = mmax;

for (int i = mid - 1; i >= left; --i)

{

t += nums[i];

mmax = max(mmax, t);

}

t = mmax;

for (int i = mid + 1; i <= right; ++i)

{

t += nums[i];

mmax = max(mmax, t);

}

return max(mmax, max(lmax, rmax));

}

};

参考:https://www.cnblogs.com/grandyang/p/4377150.html

(2)解读

参考:https://www.jianshu.com/p/3a38d523503b

4. 相关知识

(1)滑动窗口法

滑动窗口其实就是选取部分序列作为窗口,窗口不停移动,直至找到答案,感觉这更像一种思想。

详细介绍可以参考:https://www.cnblogs.com/huansky/p/13488234.html

(2) Lamda表达式

Lamda表达式可以直接在需要调用函数的位置定义短小精悍的函数,而不需要预先定义好函数,但是不便于复用,适用于比较简单且不需要复用的函数。写法为:

func(input1,input2,[],(type1 parameter1,type2 parameter2){函数;})

详细介绍参考:https://blog.csdn.net/A1138474382/article/details/111149792

(3) 基于范围的for循环(Range-based for loop)

c++11中加入的新特性,类似于python,matlab等面向对象语言的for循环,写法为:

for(auto i:array){;}

详细介绍参考:https://blog.csdn.net/hailong0715/article/details/54172848

(4)kadane算法

参考:https://zhuanlan.zhihu.com/p/85188269

Leetcode No.53 Maximum Subarray(c++实现)的更多相关文章

  1. [Leetcode][Python]53: Maximum Subarray

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...

  2. Leetcode之53. Maximum Subarray Easy

    Leetcode 53 Maximum Subarray Easyhttps://leetcode.com/problems/maximum-subarray/Given an integer arr ...

  3. 【LeetCode】53. Maximum Subarray (2 solutions)

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  4. 【一天一道LeetCode】#53. Maximum Subarray

    一天一道LeetCode系列 (一)题目 Find the contiguous subarray within an array (containing at least one number) w ...

  5. 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...

  6. LeetCode OJ 53. Maximum Subarray

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

  7. [leetcode DP]53. Maximum Subarray

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

  8. 【Leetcode】53. Maximum Subarray

    题目地址: https://leetcode.com/problems/maximum-subarray/description/ 题目描述: 经典的求最大连续子数组之和. 解法: 遍历这个vecto ...

  9. 53. Maximum Subarray【leetcode】

    53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...

随机推荐

  1. 90%的人都不知道的Node.js 依赖关系管理(上)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...

  2. C 语言通用模板队列

    前言 嵌入式开发过程中,各个模块之间,各个设备之间进行交互时,都会存在数据的输入输出,由于处理的方式不同,数据不会立即同步处理,因此通常在设计时都会设计缓冲区进行数据的处理,方式数据丢失等问题:一个项 ...

  3. nginx 的访问日志切割

    1. 高级用法–使用 nginx 本身来实现 当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志这时候当然就需要从 nginx ...

  4. C# 移除字符串头尾指定字符

    1 private void button1_Click(object sender, EventArgs e) 2 {//去掉字符串头尾指定字符 3 string MyInfo= "--中 ...

  5. sql 处理数据字段为NULL 若不为空则显示该值,若为空转换成别的值。

    第一种方法: 判断字段是否为空,如果为空转成你要的字符 1.oracle : nvl("字段名",'转换后的值')://字段名是双引号,转换后的值是单引号 2.sql Server ...

  6. MySQL笔记04(黑马)

    今日内容 多表查询 事务 DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...

  7. 【NX二次开发】Block UI 指定方位

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  8. 【NX二次开发】UF_CSYS_map_point()函数,绝对坐标,工作坐标,部件之间坐标转换。

    UF_CSYS_map_point用来变换点的坐标,比较简单且实用.例如工作坐标系与绝对坐标系转换,一个部件的坐标与另一个部件坐标系之间的转换.下面的例子是在三个坐标下创建三个点相对坐标为{10,50 ...

  9. 【NX二次开发】创建老版的基准平面uf5374

    使用uf5374() 源码: double dP1[3] = { 0.0,0.0,0.0 }; double dP2[3] = { 0.0,1.0,0.0 }; double dP3[3] = { 0 ...

  10. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...