题目: * 说明:股票交易日中,假设最多可以进行2次买卖(即:买和卖次数<=2)
* 规则是必须一笔交易成交后进行另一笔(即买-卖-买-卖的顺序进行)
* 假设一天中股票变化序列prices:[10,22,5,75,65,80],长度为n=6
* 保证长度<=500
* 计算一天中可以获得的最大收益(87)
实现代码:
public class StockQuestion { //测试 public static void main(String[] args) { Integer[] prices=new Integer[]{10,22,5,75,65,80}; Set<Integer> sets=new HashSet<Integer>(); //分制处理 for (int i = 1; i < (prices.length-1); i++) { System.out.println("第"+i+"组数据"); Integer[] params1=new Integer[i+1]; Integer[] params2=new Integer[prices.length-i]; System.arraycopy(prices,0,params1,0,i+1); System.arraycopy(prices,i,params2,0,prices.length-i); sets.add(getMaxDvalues(params1)+getMaxDvalues(params2)); } List<Integer> list=setToListAsc(sets); System.out.println("输出list列表信息========"); printArray(list); //获取最大值 Integer max=list.get(sets.size()-1); System.out.println("最大值为====="+max); } //一、不考虑空间的代价 //思想:(1)先获取权值,权值是2子集差。 //(2)将权值按递增方式排序 //(3)获取前两个最大是值和 //说明:1、先买,再卖;2、正常情况下,或者要获取最大值,肯定卖出比买入的大; // 3、序列是随机变化的,买入不会再可以买之前的股票 // 比如:买入22的股票,就不能再次购买10的股票。 //注意:set有去重的效果,并获取最大值 private static Integer getMaxDvalues(Integer[] data){ Set<Integer> sets=new HashSet<Integer>(); //获取权值:0~i,j~length,其中,i<j,权值为:a[j]-a[i] for (int i = 0; i < data.length-1; i++) { for (int j = i+1; j < data.length; j++) { if(data[j]>data[i]){ sets.add(data[j]-data[i]); }else{ sets.add(0); } } } Integer max=setToListAsc(sets).get(sets.size()-1); return max; } //set转化为list,并按升序排列 public static List<Integer> setToListAsc(Set<Integer> sets){ List<Integer> lists=new ArrayList<Integer>(sets); Collections.sort(lists); return lists; } //输出数组所有数据 public static void printArray(List<Integer> list){ if(list!=null && list.size()>0){ for (Integer i: list) { System.out.print(i+","); } System.out.println("=========输出结束=========="); } } }