LeetCode 121.买卖股票的最佳时机I
简单
-
题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票 -
示例:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
- 方法:动态规划。
- cpp代码实现:
class Solution
{
int maxProfit(vector<int>& prices)
{
if(prices.size() <= 1)
return 0;
int maxP = 0;
int minP = prices[0];
for(int i = 1; i < prices.size(); i++)
{
maxP = max(maxP, prices[i] - minP);
minP = min(minP, prices[i]);
}
return maxP;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
LeetCode 122.买卖股票的最佳时机II
简单
-
题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -
示例:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
-
方法:贪心算法(说实话还不是很明白贪心算法,但是这道题我懂了)。
-
cpp代码实现:
class Solution
{
int maxProfit(vector<int>& prices)
{
if(prices.size() <= 1)
return 0;
int maxP = 0;
for(int i = 1; i < prices.size(); i++)
{
int temp = prices[i] - prices[i - 1];
if(temp > 0)
maxP += temp;
}
return maxP;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
LeetCode 94.二叉树的中序遍历(非递归)
中等
- 题目:给定一个二叉树,返回它的中序 遍历。
- 示例:
输入: [1,null,2,3]
输出: [1,3,2]
- 方法:用辅助栈实现非递归中序遍历。
- cpp代码实现:
class Solution
{
vector<int> inorderTraversal(TreeNode* root)
{
vector<int>res;
if(root == NULL)
return res;
stack<TreeNode*>st;
TreeNode* ptr = root;
while(!st.empty() || ptr != NULL)
{
while(ptr != NULL)
{
st.push(ptr);
ptr = ptr->left;
}
if(!st.empty())
{
ptr = st.top();
res.push_back(ptr->val);
st.pop();
ptr = ptr->right;
}
}
return res;
};
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
【写在最后】
好多之前练习过的题目再拿来看的时候,还是写不出来,就很伤,可是没办法,温故而知新,只能不断重复练习,让自己不断熟悉。每天坐在电脑前脑子很累,整个人都麻木了。今天淅淅沥沥下了一天的雨,下雨的时候总是会伤感,会想很多~~~