算法一:股票交易日

题目: * 说明:股票交易日中,假设最多可以进行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("=========输出结束==========");
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值