这一周股市价格为[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;
    }
}

 

 运行结果如下

 

 

 

                     

posted @ 2019-12-19 10:17  未来有熊  阅读(535)  评论(1编辑  收藏  举报