具体代码如下
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; } }
运行结果如下