这一周股市价格为[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); } }
运行结果如下:
扩展
给定一个数组,它的第 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; } }
运行结果如下
上一篇: 基于Vue的前后端分离项目实践