best-time-to-buy-and-sell-stock I &&II && III && IVbest-time-to-buy-and-sell-stock-ii

1、买卖股票的最佳时机

假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。

 1 public class Solution {
 2     /**
 3      * @param prices: Given an integer array
 4      * @return: Maximum profit
 5      */
 6     public int maxProfit(int[] prices) {
 7         // write your code here if(prices.length<2)  return 0;
 8         if(prices.length<2)  return 0;
 9         int maxProfit = 0;
10         int minprice = prices[0];
11         for(int i=1;i<prices.length;i++){
12             minprice = Math.min(minprice , prices[i]);
13             maxProfit = Math.max(maxProfit , prices[i]-minprice);
14         }
15         return maxProfit;
16     }
17 }

2、买卖股票的最佳时机 II

假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

这个也可以算作比较简单的贪心算法,当前的价格如果高于昨日的价格,我们就进行交易,直到遍历完毕。

 1 class Solution {
 2     /**
 3      * @param prices: Given an integer array
 4      * @return: Maximum profit
 5      */
 6     public int maxProfit(int[] prices) {
 7         // write your code here
 8         if(prices.length<2)  return 0;
 9         int maxProfit = 0;
10         for(int i=1;i<prices.length;i++){
11             int diff=prices[i]-prices[i-1];
12             if(diff>0){
13                 maxProfit = maxProfit+diff;
14             }
15         }
16         return maxProfit;
17     }
18 }

3、买卖股票的最佳时机 III

假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。

样例

给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6

注意

你不可以同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

分析思路:这个问题和第二题的感觉又不一样,使用的是动态规划的思路,可以将这个问题一分为二,既然最多完成两笔交易,假设第一交易发生在第i天,即可将这个问题看成i之前求最大利润和i之后求最大利润,最后两个加和。通过i的遍历,即可找出来整个数组的最佳i,获得最大利润。

class Solution {
    /**
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    public int maxProfit(int[] prices) {
        // write your code here
        if(prices.length < 2)  return 0;
        int n=prices.length;
        int[] profit1=new int [n];
        int[] profit2=new int [n];
       
        for(int i=0;i<n;i++){
            int minprice=prices[0];
            int maxprofit=0;
            for(int j=0;j<i;j++){
                minprice = Math.min(minprice,prices[j]);
                maxprofit = Math.max(maxprofit,prices[j]-minprice);
            }
            profit1[i]=maxprofit;
            minprice=prices[i];
            maxprofit=0;
            for(int j=i;j<n;j++){
                minprice = Math.min(minprice,prices[j]);
                maxprofit = Math.max(maxprofit,prices[j]-minprice);
            }
            profit2[i]=maxprofit;
        }
        int maxProfit = 0 ;
        int curprofit = 0;
        for(int i=0;i<n;i++){
            curprofit=profit1[i]+profit2[i];
            if(curprofit>maxProfit) maxProfit=curprofit;
        }
        return maxProfit;
    }
};

买卖股票的最佳时机 IV  这道题我还不会写,等写出来再更新

posted @ 2015-11-14 00:02  码代码的banana  阅读(213)  评论(0编辑  收藏  举报