欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-05 18:17:43
具体代码如下 package com.trs.codetool.core; import java.util.Scanner; /** * @author zheng.changgang * @date 2019-12-19 10:01 * 这一周股市价格为[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);
    }
}

运行结果如下:

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

 

 

扩展

给定一个数组,它的第 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;
    }
}

 

 运行结果如下

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