腾讯精选50题—Day10题目121,122,124
第十天~
1. 题目121 买卖股票的最佳时机
(1) 题目描述

(2) 思路
只一次买进卖出的话,那么只需要遍历一边,记录最低和股票价格并计算最大利润即可。
(3) 题解
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if (len < 2)
return 0;
int profix = 0;
int buy = 0;
for (int i = 1; i < len; i++)
{
if (prices[buy] > prices[i])
{
buy = i;
continue;
}
else {
int temp = prices[i] - prices[buy];
if (temp > profix)
{
profix = temp;
}
}
}
return profix;
}
};
结果:

时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
2. 题目122 买卖股票的最佳时机II
(1) 题目描述


(2) 思路
贪心思想,只要今天比昨天高,那么就卖出。
(3) 题解
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++)
{
if (prices[i] - prices[i - 1] >= 0)
{
result += prices[i] - prices[i - 1];
}
}
return result;
}
};
结果:

时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
3. 题目124 二叉树中的最大路径和
(1) 题目描述


(2) 思路
递归。对于一个根节点为A,左子树为B,右子树为C的子树来说,最大路径和一共有三种情况:
a. A+B+C;
b. B+A+A的祖先结点;
c. C+A+A的祖先结点;
使用全局变量存储最大路径和(初始化为INT_MIN),递归即可。
(3) 题解
class Solution {
public:
int maxGain = INT_MIN;
int maxPathSum(TreeNode* root) {
int num = Travel(root);
return maxGain;
}
int Travel(TreeNode* root)
{
if (root == NULL)
return 0;
int leftGain = max(Travel(root->left), 0);
int rightGain = max(Travel(root->right), 0);
int tempGain = leftGain + rightGain + root->val;
maxGain = max(tempGain, maxGain);
return root->val + max(leftGain, rightGain);
}
};
结果:

时间复杂度:
O
(
n
)
O(n)
O(n) n为二叉树的结点数
空间复杂度:
O
(
h
e
i
g
h
t
)
O(height)
O(height) height为二叉树的高度
本文介绍了三个经典的算法问题:买卖股票的最佳时机、最佳时机II和二叉树中的最大路径和。针对每个问题,分别给出了详细思路和C++实现,并分析了时间复杂度和空间复杂度。这些问题主要涉及动态规划和递归策略,是算法学习的重要实例。
676

被折叠的 条评论
为什么被折叠?



