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. JRebel插件使用详解(IDEA热部署)(Day_44)

    JRebel插件使用详解 简介 JRebel是一套JavaEE开发工具. Jrebel 可快速实现热部署,节省了大量重启时间,提高了个人开发效率. JRebel是一款JAVA虚拟机插件,它使得JAVA ...

  2. Lua学习高级篇

    Lua学习高级篇 之前已经说了很多,我目前的观点还是那样,在嵌入式脚本中,Lua是最优秀.最高效的,如果您有不同的观点,欢迎指正并讨论,切勿吐槽.这个系列完全来自于<Programming in ...

  3. Python+Selenium学习笔记7 - os模块

    os模块是关于文件/目录方面的 导入语法 import os 相关方法 path.abspath()   用来获取当前路径下的文件 os.path.abspath('checkbox.html')  ...

  4. THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。

    问题: 上述内容中,标题和学年属于一个数据表.分类则属于另外一个数据表,并且是利用id关联后,另外一个数据表中的title字段. 需要设置关键字搜索,实现多表关联查询和多表字段的关键字搜索. 解决方法 ...

  5. 桥接PyTorch和TVM

    桥接PyTorch和TVM 人工智能最引人入胜的一些应用是自然语言处理.像BERT或GPT-2之类的模型及其变体,可以获住足够多的文本信息. 这些模型属于称为Transformers的神经网络类体系结 ...

  6. 特斯拉Tesla Model 3整体架构解析(下)

    特斯拉Tesla Model 3整体架构解析(中) Tesla Computer Unit 特斯拉已经开发了一个由自动驾驶仪和信息计算机组成的定制"液冷双计算平台"."他 ...

  7. NSight Compute 用户手册(中)

    NSight Compute 用户手册(中) NVIDIA Nsight Compute支持密码和私钥身份验证方法.在此对话框中,选择身份验证方法并输入以下信息: 密码 IP/主机名:目标设备的IP地 ...

  8. 【.NET 与树莓派】温度/湿度传感器——SHT30

    SHT3XX 系列的传感,常见的有三种:SHT 30.SHT 31.SHT 35.其中,比较便宜性价比较愉快的是 SHT 30. DHT 11 模块也是检测温度.湿度的,但SHT 11 使用的不是我们 ...

  9. QT基本数据类型

    因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型. QT基本数据类型定义在#inclu ...

  10. 【NX二次开发】Block UI 操作按钮

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