zoukankan      html  css  js  c++  java
  • 188. Best Time to Buy and Sell Stock IV leetcode解题笔记

    Say you have an array for which the ith element is the price of a given stock on day i.

    Design an algorithm to find the maximum profit. You may complete at most k transactions.

    Note:
    You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

    这一题比上一题出现的变化 为 限制不再为两次 而是K次 再一次增加了难度

    因为上一题的原因   这里想到了常用的一种算法  动态规划  虽然上一题的动态规划很抽象 但是这里我们具体化一点

    首先我们的动态方程怎么设计 根据要求

    能不能用一个二维数组profit[t,i]表示  通过T次交易 在第I个商品能获得的最大利润   那么profit[k,n]就是在第N个商品通过K次交易能获得的最大利润

    根据推理 得出下列方程

    profit[t,i]=max(profit(t,i-1),prices[i]+tmp)

    tmp=max(tmp,profit(t-1,i-1)-prices[i])

    tmp初始化为第一个商品的价格 

    这里解释一下 tmp的方程怎么来的 profit(t-1,i-1)-prices[i]表明 在第i-1个商品通过t-1次交易获得利润后 再买入第i个商品 并且跟之前的tmp比较取最大值

    profit[t,i]中prices[i]+tmp 表明在之前的tmp基础上 卖出第I个商品获得的利润  和除去第I个商品获得的利润作比较 最大值

    同时我们要知道K次是用户自定的 这里有一种特殊情况 我们买东西和卖东西就是两次动作  假设数组有四个数  我们最多进行两次交易 也就是4/2  假设用户给定K大于4/2 就回到了之前我们解决的第二个问题 不限定交易次数 获得最大交易值

    这种特殊情况显然不能用动态方程 先除去这种情况 再用动态方程求解

    有了思路 开始码代码 

    public class Solution {
        public int maxProfit(int k, int[] prices) {
            if(k>prices.length/2)
            return inmaxProfit(prices);
            int profit[][] =new int[k+1][prices.length];
            for(int i=1;i<=k;i++){
                int tmp=-prices[0];
                for(int j=1;j<prices.length;j++){
                    profit[i][j]=Math.max(profit[i][j-1],prices[j]+tmp);
                    tmp=Math.max(tmp,profit[i-1][j-1]-prices[j]);
               }
            }
            return profit[k][prices.length-1];
        }
        public int inmaxProfit(int[] prices){
            int profit=0;
            for(int i=0;i<prices.length-1;i++){
                int diff=prices[i+1]-prices[i];
                if(diff>0){
                    profit++;
                }
            }
            return profit;
        }
    }
    

    提交

    看看哪里出了问题

    给出的K是2  大于三个数的一半  所以进入的是第二个函数 

    profit++  错了   应该是profit+=diff 修改 提交

    public class Solution {
        public int maxProfit(int k, int[] prices) {
            if(k>prices.length/2)
            return inmaxProfit(prices);
            int profit[][]=new int[k+1][prices.length];
                 for(int i=1;i<=k;i++){
                   int tmp=-prices[0];
                 for(int j=1;j<prices.length;j++){
              profit[i][j]=Math.max(profit[i][j-1],prices[j]+tmp);
                       tmp=Math.max(tmp,profit[i-1][j-1]-prices[j]);
               }
            }
            return profit[k][prices.length-1];
        }
        public int inmaxProfit(int[] prices){
                int profit=0;
                 for(int i=0;i<prices.length-1;i++){
                  int diff=prices[i+1]-prices[i];
                if(diff>0){
                    profit+=diff;
                }
            }
            return profit;
        }
    }
    

      

    成功

  • 相关阅读:
    SQL注入过滤
    ASP.NET长文章分页
    简单的权限管理类
    不错的面试题
    【转载】【重要】Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结
    回到xwindows
    suse11 linux不自动启动xwindows
    flash的几种工具
    mencoder和ffmpeg参数详解
    ffmpeg和Mencoder使用实例小全
  • 原文地址:https://www.cnblogs.com/Mrjie/p/6010744.html
Copyright © 2011-2022 走看看