文章目录
前言
今天算法的内容是:动态规划
一、 爬楼梯
假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
一、思路:
(1)如果是三阶以下直接返回即可
(2)如果是三阶以上则将前两次的状态相加就是当前的状态,循环n次;
二、源码
class Solution {
public:
int climbStairs(int n) {
int a=1,b=2,c=0;
if(n<3) return n;
for(int i=3 ;i<=n ;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
};
三.知识点
斐波那契数列
二、 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
一、思路:
(1)过去的状态与下一次的状态相加并与下一次状态的进行对比,对比出现在最好的状态
(2)将过去所记录的最好的状态与现在的状态进行比较,选出最好的状态
(3)突然想到为什么 状态会 时刻变化呢?那是因为状态会随着循环次数的变化而与下一次状态相加变化着,可能会变弱,也可能会变强
二、源码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max=-1000000,now=0;
for(int i=0;i<nums.size();i++){
now=now+nums[i] > nums[i]?now+nums[i]:nums[i];
max=max > now?max:now;
}
return max;
}
};
//第一次 超时辣 代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum=0,max=-100000;
int len=nums.size();
for(int i=0 ;i<len ;i++){
for(int j=i ;j<len ;j++){
sum+=nums[j];
if(sum > max){
max=sum;
}
}
sum=0;
}
return max;
}
};
三.知识点
动态规划