leecode第一百二十二题(买卖股票的最佳时机II)

本文介绍了一种计算股票买卖最大累积利润的算法实现。通过寻找价格波动中的上升区间来累加每次交易的利润,最终得到最大利润。文章还强调了在遍历过程中需要注意数组边界的细节。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len<=0)
            return 0;
        
        int sta=0,lirun=0;
        while(sta<len-1)
        {
            while(sta<len-2 && prices[sta]>prices[sta+1])//找到当前第一个最小值
                sta++;
            if(sta==len-2 && prices[sta]>prices[sta+1])
                return lirun;
            
            int max_num=sta+1;
            while(max_num<len-2 && prices[max_num]<prices[max_num+1])//找到第一个最小值后的第一个不小于后面的值
                max_num++;
            if(max_num==len-2 && prices[max_num]<prices[max_num+1])
                max_num++;
            
            lirun=lirun+prices[max_num]-prices[sta];//我们认为最近的利润是当前第一个最小值和第一个不输第二天的值的差,而这种利润的和不会少于全局唯一最大利润
            sta=max_num+1;
        }
        
        return lirun;
    }
};

分析:

思路有,但是一开始不确认正不正确,但是举的例子告诉我这样想目前是对的,于是就写了。

值的注意的是,while(max_num<len-2 && prices[max_num]<prices[max_num+1]),这句话里以后一定要先把值的边界性判断放前面,不然max_num+1超出边界,会提示错误。

转载于:https://www.cnblogs.com/CJT-blog/p/10641841.html

### LeetCode 144:二叉树的前序遍历 #### 目描述 给定一个二叉树,返回其节点值的前序遍历。 **示例:** 输入: `[1,null,2,3]` 输出: `[1,2,3]` **解释:** 对于以下二叉树: ```plaintext 1 \ 2 / 3 ``` 它的前序遍历为 `1 -> 2 -> 3`. --- #### 解决方案 ##### 方法一:递归实现 通过递归的方式可以轻松解决此问。前序遍历遵循 **根 → 左子树 → 右子树** 的顺序访问节点。 代码如下: ```java class Solution { List<Integer> result = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if (root == null) return result; // 访问当前节点 result.add(root.val); // 递归访问左子树 preorderTraversal(root.left); // 递归访问右子树 preorderTraversal(root.right); return result; } } ``` 上述方法利用了递归特性来简化逻辑[^4]。 ##### 方法二:迭代实现(使用栈) 可以通过显式的栈结构模拟递归过程,从而避免函数调用开销较大的情况。 代码如下: ```java import java.util.*; class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); if (root != null) { stack.push(root); } while (!stack.isEmpty()) { TreeNode node = stack.pop(); // 添加当前节点到结果列表 result.add(node.val); // 先压入右孩子再压入左孩子,因为栈是后进先出 if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } return result; } } ``` 这种方法更高效地处理大规模数据,并且能够更好地控制内存消耗[^5]。 --- ### 总结 无论是采用递归方式还是基于栈的迭代方式,都可以有效解决问。具体选择取决于实际需求以及对性能的要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值