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 ...
随机推荐
- 90%的人都不知道的Node.js 依赖关系管理(上)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...
- C 语言通用模板队列
前言 嵌入式开发过程中,各个模块之间,各个设备之间进行交互时,都会存在数据的输入输出,由于处理的方式不同,数据不会立即同步处理,因此通常在设计时都会设计缓冲区进行数据的处理,方式数据丢失等问题:一个项 ...
- nginx 的访问日志切割
1. 高级用法–使用 nginx 本身来实现 当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志这时候当然就需要从 nginx ...
- C# 移除字符串头尾指定字符
1 private void button1_Click(object sender, EventArgs e) 2 {//去掉字符串头尾指定字符 3 string MyInfo= "--中 ...
- sql 处理数据字段为NULL 若不为空则显示该值,若为空转换成别的值。
第一种方法: 判断字段是否为空,如果为空转成你要的字符 1.oracle : nvl("字段名",'转换后的值')://字段名是双引号,转换后的值是单引号 2.sql Server ...
- MySQL笔记04(黑马)
今日内容 多表查询 事务 DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...
- 【NX二次开发】Block UI 指定方位
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 【NX二次开发】UF_CSYS_map_point()函数,绝对坐标,工作坐标,部件之间坐标转换。
UF_CSYS_map_point用来变换点的坐标,比较简单且实用.例如工作坐标系与绝对坐标系转换,一个部件的坐标与另一个部件坐标系之间的转换.下面的例子是在三个坐标下创建三个点相对坐标为{10,50 ...
- 【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 ...
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...