Leetcode No.53 Maximum Subarray(c++实现)
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++实现)的更多相关文章
- [Leetcode][Python]53: Maximum Subarray
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...
- Leetcode之53. Maximum Subarray Easy
Leetcode 53 Maximum Subarray Easyhttps://leetcode.com/problems/maximum-subarray/Given an integer arr ...
- 【LeetCode】53. Maximum Subarray (2 solutions)
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- 【一天一道LeetCode】#53. Maximum Subarray
一天一道LeetCode系列 (一)题目 Find the contiguous subarray within an array (containing at least one number) w ...
- 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...
- LeetCode OJ 53. Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [leetcode DP]53. Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 【Leetcode】53. Maximum Subarray
题目地址: https://leetcode.com/problems/maximum-subarray/description/ 题目描述: 经典的求最大连续子数组之和. 解法: 遍历这个vecto ...
- 53. Maximum Subarray【leetcode】
53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...
随机推荐
- Assignment Problem的若干思考
最近受到南京一个同学的push,又开始了博客园写作之旅.欢迎大家联系我做代码实现工作,QQ:1198552514.权当赚点生活费~ 我的研究也经常用的Assignment problem,而且很多 ...
- vue相关面试知识点总结
vue v-for循环中为什么要用key?为什么index不能作为key? key 的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes.如 ...
- oracle实现通过logminer实现日志抓取分析
场景:现场库到前置库. 思考:使用触发器? 1.侵入性解决方案 2.需要时各种配置,不需要时又是各种配置 Change Data Capture:捕捉变化的数据,通过日志监测并捕获数据库的变动(包括数 ...
- Go语言的函数02---参数
package main import "fmt" /* 常量,变量,函数---源代码的成员 给成员命名的字符称之为[标识符] 合法的标识符有:大小写字母,数字,下划线 命名时不能 ...
- 前端基础——js数据类型及判断方法
一.数据类型 我们通常熟知的数据类型有六种,包括5种基本数据类型(Number, String, Boolean, Undefined, Null)和一种引用数据类型(Object).ES6又新增了一 ...
- nologin用户执行命令
使用su su -s 是指定shell,这里www用户是nologin用户,是没有默认的shell的,这里指定使用/bin/bash, -c 后面接需要运行的命令, 后面www是用www用户来运行 s ...
- TensorRT 7.2.1开发初步
TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...
- 【渗透实战】sqlmap_修改tamper脚本_绕过WAF_第三期
/文章作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334/ 今天google找注入点的时候发现某企业一个挺有意思的waf 常规操作绕过去后决定写一篇博客 信息收集 ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
- vue3.0搭建项目
安装node.js 查看版本node -v 安装vue3.0版本之前需要先把vue-cli升级到4.0版本, 如果之前安装过vue-cli需要把2.0相关的卸载之后重新安装,npm uni -g vu ...