本文最后更新于:2023年3月19日 晚上
Lt122. 买卖股票的最佳时机 II、Lt144. 二叉树的前序遍历、Lt145. 二叉树的后序遍历
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
1 2 3 4 5 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
1 2 3 4 5 输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
1 2 3 输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4
思路 未限制购买次数,实际上只要当前的价格比前一天高就可以卖出。
解答 1 2 3 4 5 6 7 8 9 10 var maxProfit = function (prices ) { let sum = 0 ; for (let i = 1 ; i < prices.length; i++) if (prices[i] > prices[i - 1 ]) sum += prices[i] - prices[i - 1 ]; return sum; };
难度中等 446 收藏分享切换为英文接收动态反馈 给你二叉树的根节点 root
,返回它节点值的 前序 _ _遍历。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
树中节点数目在范围 [0, 100]
内
-100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路 递归 二叉树普通递归即可
迭代 可以通过栈来模拟,要注意的先序遍历先访问左节点再访问右节点,所以入栈的时候应该先加入右节点,再加入左节点
解答 递归 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var preorderTraversal = function (root ) { const res = []; const traverse = (node ) => { if (!node) return ; res.push(node.val); traverse(node.left); traverse(node.right); }; traverse(root); return res; };
迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var preorderTraversal = function (root ) { if (!root) return []; const res = []; const queue = []; queue.push(root); while (queue.length) { const node = queue.shift(); res.push(node.val); if (node.right) queue.unshift(node.right); if (node.left) queue.unshift(node.left); } return res; };
给定一个二叉树,返回它的 后序 *遍历。 * 示例:**
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路 递归 二叉树遍历常规递归即可
迭代 设置一个 prev 用于记录上一个遍历完毕的节点。先将左子树都加入栈中,直到节点的左子树为空。出栈一个元素,判断其是否无右子树和是否为上一个遍历的节点 ,如果是的话,说明为叶子节点或左右子树都已经全部遍历完毕的节点,可以将当前节点的值加入结果数组了,加入后,将 prev 指向当前节点避免重复遍历右子树。
解答 递归 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var postorderTraversal = function (root ) { const res = []; const traverse = (node ) => { if (!node) return ; traverse(node.left); traverse(node.right); res.push(node.val); }; traverse(root); return res; };
迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 var postorderTraversal = function (root ) { const stack = []; const res = []; let prev = null ; while (root || stack.length) { while (root) { stack.push(root); root = root.left; } const node = stack.pop(); if (!node.right || node.right === prev) { res.push(node.val); prev = node; } else { stack.push(node); root = node.right; } } return res; };