53.最大子数组和
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组
是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
思路详解:本题使用动态规划即可,状态转移方程如下:
我们用f(i)来表示第i个元素结尾的子数组的最大和
1. f(i-1)<=0 nums[i]
2. f(i-1)>0 nums[i]+f(i-1)
代码详解:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre=nums[0],ans=nums[0];
for(int i=1;i<nums.size();i++)
{
pre=pre>0?pre+nums[i]:nums[i];//状态转移,如果前面的数字构成的子数组之和小于零
ans=max(ans,pre); //说明不会对子数组有贡献,我们记录这些子数组的下一个元素重新比较
}
return ans;
}
};
面经
- 什么是c++中的类型声明和using声明
- 类型别名是使用typedef关键字来定义的,它可以为一个已存在的类型创建一个新的名称。
//对数据类型进行声明
typedef int MyInt;
MyInt var = 10;
//模板声明
template<typename T>
typedef vector<T> MyVector;
- using声明是C++11标准中引入的,它提供了一种更现代、更灵活的方式来创建类型别名。其基本形式如下:
//声明数据类型
using MyInt = int;
MyInt var = 10;
//声明模板
template<typename T>
using MyVector = vector<T>;
- using声明被认为是更现代、更灵活的语法,它通常用于替代typedef,特别是在涉及模板别名定义时。