public class Solution {
    public int MaxProfit(int[] prices)
        {
            //寻找最优极值点(包括2个端点)

            if (prices.Length < 2)
            {
                return 0;
            }
            else if (prices.Length == 2)
            {
                return prices[1] - prices[0] > 0 ? prices[1] - prices[0] : 0;
            }
            else//至少3个点
            {
                //先对原始数据进行压缩
                var list = new List<int>();
                for (int i = 0; i < prices.Length - 1; i++)
                {
                    if (prices[i] != prices[i + 1])
                    {
                        list.Add(prices[i]);
                    }
                }
                var last = list.LastOrDefault();
                if (last != prices[prices.Length - 1])
                {
                    list.Add(prices[prices.Length - 1]);
                }

                var dic = new Dictionary<int, int>();//记录所有极值点极其类型
                //Key是index,Value是类型:-1是极小,1是极大

                //list已经压缩,没有平行点了
                for (int i = 1; i < list.Count - 1; i++)
                {
                    //判断是否是极大值点
                    if (list[i - 1] < list[i] && list[i] > list[i + 1])
                    {
                        dic.Add(i, 1);
                    }
                    else if (list[i - 1] > list[i] && list[i] < list[i + 1])
                    {
                        dic.Add(i, -1);
                    }
                    //判断是否是极小值点
                }

                //处理端点
                if (dic.Count == 0)
                {
                    return list[list.Count - 1] - list[0] > 0 ? list[list.Count - 1] - list[0] : 0;
                }
                else
                {
                    var list2 = dic.OrderBy(x => x.Key).ToList();
                    var d1 = list2.FirstOrDefault();
                    var d2 = list2.LastOrDefault();
                    if (d1.Value == 1)
                    {
                        list2.Add(new KeyValuePair<int, int>(0, -1));
                    }
                    else
                    {
                        list2.Add(new KeyValuePair<int, int>(0, 1));
                    }

                    if (d2.Value == 1)
                    {
                        list2.Add(new KeyValuePair<int, int>(list.Count - 1, -1));
                    }
                    else
                    {
                        list2.Add(new KeyValuePair<int, int>(list.Count - 1, 1));
                    }

                    list2 = list2.OrderBy(x => x.Key).ToList();//得到全部的极值点


                    var maxProfit = 0;

                    for (int i = 0; i < list2.Count; i++)
                    {
                        if (list2[i].Value == -1)
                        {
                            for (int j = i; j < list2.Count; j++)
                            {
                                if (list2[j].Value == 1)
                                {
                                    if (list[list2[j].Key] - list[list2[i].Key] > maxProfit)
                                    {
                                        maxProfit = list[list2[j].Key] - list[list2[i].Key];
                                    }
                                }
                            }
                        }
                    }
                    return maxProfit;
                }


            }
        }
}

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/#/description

原来的计算方式太复杂了,使用优化的方式如下,C++语言实现:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minprice = INT_MAX;
        int maxprofit = 0;
        for (int i = 0; i < prices.size(); i++)
        {
            if (minprice > prices[i])
            {
                minprice = prices[i];
            }
            else if (prices[i] - minprice > maxprofit)
            {
                maxprofit = prices[i] - minprice;
            }
        }
        return maxprofit;
    }
};

 

补充一个python的实现:

 1 import sys
 2 class Solution:
 3     def maxProfit(self, prices: List[int]) -> int:
 4         n = len(prices)
 5         maxval = 0
 6         minval = sys.maxsize
 7         for i in range(n):
 8             cur = prices[i]
 9             minval = min(minval,cur)
10             maxval = max(maxval,cur-minval)
11         return maxval

 

Java版本:

 1 class Solution {
 2     public int maxProfit(int[] prices) {
 3         int min_price = Integer.MAX_VALUE;
 4         int maxprofit = 0;
 5         int l = prices.length;
 6         for(int i = 0;i < l;i++){
 7             if(prices[i] < min_price){
 8                 min_price = prices[i];
 9             }else if(prices[i] - min_price > maxprofit){
10                 maxprofit = prices[i] - min_price;
11             }
12         }
13         return maxprofit;
14     }
15 }

 

posted on 2017-04-19 11:36  Sempron2800+  阅读(175)  评论(0编辑  收藏  举报