zoukankan      html  css  js  c++  java
  • leetcode121

    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

    原来的计算方式太复杂了,使用优化的方式如下:

    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
  • 相关阅读:
    inner join ,left join ,right join 以及java时间转换
    华为机试-整形数组合并
    华为机试-公共字串计算
    两个字符串的最长公共子序列的长度
    华为机试-字符串通配符
    工作中总结的编程小技巧
    C语言高效编程的几招(绝对实用,绝对经典)
    Java float保留两位小数或多位小数
    新浪云、阿里云、百度云、谷歌云、亚马逊云
    java经典40+分析
  • 原文地址:https://www.cnblogs.com/asenyang/p/6732601.html
Copyright © 2011-2022 走看看