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
  • 相关阅读:
    yii 引入文件
    CodeForces 621C Wet Shark and Flowers
    面试题题解
    POJ 2251 Dungeon Master
    HDU 5935 Car(模拟)
    HDU 5938 Four Operations(暴力枚举)
    CodeForces 722C Destroying Array(并查集)
    HDU 5547 Sudoku(dfs)
    HDU 5583 Kingdom of Black and White(模拟)
    HDU 5512 Pagodas(等差数列)
  • 原文地址:https://www.cnblogs.com/asenyang/p/6732601.html
Copyright © 2011-2022 走看看