码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode121

时间:2017-04-19 11:37:25      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:script   lis   return   length   target   turn   ict   rip   last   

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

leetcode121

标签:script   lis   return   length   target   turn   ict   rip   last   

原文地址:http://www.cnblogs.com/asenyang/p/6732601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!