122. 买卖股票的最佳时机 II

本文探讨了三种解决股票交易问题的方法:暴力搜索策略的深度优先搜索、基于局部最优的贪心算法,以及通过状态转移的动态规划。暴力搜索虽可能超时,但贪心算法仅适用于部分场景,而动态规划提供了全局最优解。作者详细介绍了每种方法的实现和适用条件。
摘要由CSDN通过智能技术生成

方法1 :暴力搜索,但是会超时


class Solution {
    private int ans;
    public int maxProfit(int[] prices) {
        if(prices.length < 2) return 0;
        this.ans = 0;
        dfs(prices,0,0,0,prices.length);//价格,位置,状态,利润

        return this.ans;
    }//判断的结尾在哪?位置截止即是

    public void dfs(int []prices,int pos,int status,int profit,int len){
        if(len == pos){
            this.ans = Math.max(this.ans,profit);
            return; 
        } //暴力搜索处是选择一种在整个队列里面收益最多的情况,所以必须是在全部结果都找到的情况下,才可以结算,单算一种根本达不到要求

        dfs(prices,pos+1,status,profit,len);//不操作
        if(status == 0)
            dfs(prices,pos+1,1,profit-prices[pos],len);//
        else
            dfs(prices,pos+1,0,profit+prices[pos],len);//
        
    }

}

方法2:贪心算法,贪心是每个局部最优,但是没有一个状态转移的前后影响的特性。

class Solution {
    public int maxProfit(int[] prices) {
        int ans = 0;
        for(int i = 1; i < prices.length; i++){
            int tmp = prices[i] - prices[i-1];
            if(tmp > 0) ans += tmp;  
        }
        return ans;
    }
}

方法3:动态规划,需要一个状态方程,状态转移,与前后最终的状态。

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        if(len < 2) return 0; 
        int [][]dp = new int[len][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i = 1; i < len; i++){
            dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
            dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
        }
        return dp[len-1][0];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值