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 }