zoukankan      html  css  js  c++  java
  • 这一周股市价格为[2,6,1,4,8],求哪一天买入哪一天卖出,可获得最大收益,最大收益为多少

    具体代码如下

    package com.trs.codetool.core;
    
    import java.util.Scanner;
    
    /**
     * @author zheng.changgang
     * @date 2019-12-19 10:01
     * 这一周股市价格为[2,6,1,4,8],求哪一天买入哪一天卖出,可获得最大收益,最大收益为多少
     */
    public class GuShiTest {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int num = scanner.nextInt();
            int[] nums = new int[num];
            for(int i=0;i<num;i++) {
                nums[i] = scanner.nextInt();
            }
            // 得到最大收益
            getBestGuShi(nums);
        }
    
        private static void getBestGuShi(int[] nums) {
            int  profit = 0;
            int min  = nums[0];
            int buyDay = 0;
            int sellDay = 0;
            for(int i=1;i<nums.length;i++) {
                if(nums[i] < min) {
                    min = nums[i];
                    buyDay = i;
                } else if(nums[i] - min > profit) {
                    profit = nums[i] - min;
                    sellDay = i;
                }
            }
            System.out.println((buyDay+1) + "天买入==="+ (sellDay +1) + "天卖出==="+"可获最大收益=="+profit);
        }
    }

    运行结果如下:

    扩展

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

    注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
    具体代码如下:(运用动态规划)
    package com.trs.codetool.core;
    
    import java.util.Scanner;
    
    /**
     * @author zheng.changgang
     * @date 2019-12-19 14:33
     *  买卖股票的最佳时机 IV
    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
    
    设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
    
    注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
     */
    public class GuPiaoTest2 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int num = scanner.nextInt();
            int[] nums = new int[num];
            for(int i=0;i<num;i++) {
                nums[i] = scanner.nextInt();
            }
            System.out.println("输入最多交换k次");
            int k = scanner.nextInt();
            int max = getMaxProfit(nums,k);
            System.out.println("k次最大收益为:"+max);
        }
    
        private static int getMaxProfit(int[] prices,int k) {
            // 三维数组 第一个代表股票的序号 第二个代表交易k次 第三个代表持有股票的数量 只能0 或者1
            int[][][] mp = new int[prices.length][k+1][2];
            mp[0][0][0] = 0;
            mp[0][0][1] = -prices[0];
            for(int i=1;i<prices.length;i++) {
                mp[i][0][0] = mp[i-1][0][0];
                // 0次交易 持股为1
                mp[i][0][1] = Math.max(mp[i-1][0][0] - prices[i], mp[i-1][0][1]);
                for(int j=1;j<=k;j++) {
                    // j次交易持股为0
                    mp[i][j][0] = Math.max(mp[i-1][j-1][1] + prices[i], mp[i-1][j][0]);
                    // j次交易持股为1
                    mp[i][j][1] = Math.max(mp[i-1][j-1][0] - prices[i],mp[i-1][j][1]);
                }
                // 第k次交易持股0
               // mp[i][k][0] = (mp[i-1][k-1][1] + prices[i]) > mp[i-1][k][0] ?(mp[i-1][k-1][1] + prices[i]):mp[i-1][k][0] ;
            }
            int max = 0;
            for(int i=0;i<prices.length;i++) {
                for(int j=0;j<=k;j++) {
                  if(mp[i][j][0] > max) {
                      max = mp[i][j][0];
                  }
                }
    
            }
            return max;
        }
    }

     运行结果如下

                         

  • 相关阅读:
    [转]JavaWeb学习总结(五十)——文件上传和下载
    [转]JavaWeb学习总结(四十九)——简单模拟Sping MVC
    [转]JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet
    [转]javaweb学习总结(四十七)——监听器(Listener)在开发中的应用
    [转]javaweb学习总结(四十六)——Filter(过滤器)常见应用
    [转]javaweb学习总结(四十五)——监听器(Listener)学习二
    js数组的方法
    神策埋点
    微信分享
    微信小程序
  • 原文地址:https://www.cnblogs.com/zcg1051980588/p/12066244.html
Copyright © 2011-2022 走看看