买卖股票的最佳时机 I II

做了两个关于股票买卖的算法题,题目如下


题一

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。
个人分析:只能买卖一下,这个时候,从数学的角度来讲,当天价格减去昨天价格,若为正数,就是赚,若为负数,就是亏,将这些数当成另外一个序列,取这些数的最大正子数组。即为最大利润。

class Solution {
    public int maxProfit(int[] prices) {
       //声明利润为0
         int profit=0;
        //存储临时利润变化情况
         int temp=0;
        //记录利润最大值
         int max=0;
        //创建集合存储利润变化序列
         List<Integer> li = new ArrayList<Integer>();
         for(int i=0;i<prices.length-1;i++){
                 profit=prices[i+1]-prices[i];
                 li.add(profit);
         }
        //判断前N个数的正负,为正,接着遍历,为负,重置临时利润为零往后面取,每次当利润为正时,判断利润最大值
         for(int i : li){
             if(temp+i>0){
                 temp+=i;
                 if(max<temp)max=temp;
             }
             else{
                 temp=0;
             }
         }
         return max;

    }
}

题二

用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。

交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。

你可以完成尽可能多的交易(多次买卖股票)。
然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
分析:买卖次数不限制,即可视为若第二天比第一天大,就卖,小就不卖,转化成程序就是遍历整个数组,比较前一个数和后一个数。

 public static int maxProfit(int[] prices){
         //声明利润为0
         int profit=0;
         for(int i=0;i<prices.length-1;i++){
             if(prices[i]<prices[i+1]){
                 profit+=prices[i+1]-prices[i];
             }
         }
         return profit;

     }
阅读更多

更多精彩内容