-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathe0121.py
92 lines (75 loc) · 2.32 KB
/
e0121.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# -*- coding: utf-8 -*-
"""Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock
on day i.
If you were only permitted to complete at most one transaction (i.e., buy one
and sell one share of the stock), design an algorithm to find the maximum
profit.
Note that you cannot sell a stock before you buy one.
Example 1:
Input: [7,1,5,3,6,4]
Output: 5
Explanation:
Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Not 7-1 = 6, as selling price needs to be larger than buying price.
Example 2:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.
"""
from __future__ import annotations
from typing import Tuple
from functools import reduce
class DP(object):
@staticmethod
def __max_profit_buy_at(arr: Tuple, buy: int) -> int:
sell = reduce(lambda x, y: max(x, y), arr[buy + 1:], arr[buy])
return sell - arr[buy]
@staticmethod
def solution(arr: Tuple) -> int:
tp = (DP.__max_profit_buy_at(arr, i) for i in range(len(arr)))
return max(tp)
class Ex(object):
"""
based on extreme
"""
@staticmethod
def __if_minima(arr: Tuple[int, ...], idx: int) -> bool:
if idx >= len(arr) - 1:
return False
elif idx == 0:
if arr[idx] < arr[idx + 1]:
return True
else:
return False
elif arr[idx - 1] > arr[idx] < arr[idx + 1]:
return True
else:
return False
@staticmethod
def __if_extreme(arr: Tuple[int, ...], idx: int) -> bool:
if idx >= len(arr):
return False
elif idx == len(arr) - 1:
if arr[idx] > arr[idx - 1]:
return True
else:
return False
elif idx == 0:
if arr[idx] < arr[idx + 1]:
return True
else:
return False
elif arr[idx - 1] > arr[idx] < arr[idx + 1]:
return True
elif arr[idx - 1] < arr[idx] > arr[idx + 1]:
return True
else:
return False
if __name__ == '__main__':
in1 = (6, 4, 2, 5, 3, 7, 1, 4)
exp1 = 5
in2 = (7, 6, 4, 3, 1)
exp2 = 0
assert exp1 == DP.solution(in1)
assert exp2 == DP.solution(in2)