1+ from __future__ import annotations
2+
13arr = [- 10 , - 5 , 0 , 5 , 5.1 , 11 , 13 , 21 , 3 , 4 , - 21 , - 10 , - 5 , - 1 , 0 ]
24expect = [- 5 , 0 , 5 , 5.1 , 11 , 13 , 21 , - 1 , 4 , - 1 , - 10 , - 5 , - 1 , 0 , - 1 ]
35
46
5- def next_greatest_element_slow (arr : list ) -> list :
7+ def next_greatest_element_slow (arr : list [ float ] ) -> list [ float ] :
68 """
79 Get the Next Greatest Element (NGE) for all elements in a list.
810 Maximum element present after the current one which is also greater than the
911 current one.
1012 >>> next_greatest_element_slow(arr) == expect
1113 True
1214 """
15+
1316 result = []
14- for i in range (0 , len (arr ), 1 ):
15- next = - 1
16- for j in range (i + 1 , len (arr ), 1 ):
17+ arr_size = len (arr )
18+
19+ for i in range (arr_size ):
20+ next : float = - 1
21+ for j in range (i + 1 , arr_size ):
1722 if arr [i ] < arr [j ]:
1823 next = arr [j ]
1924 break
2025 result .append (next )
2126 return result
2227
2328
24- def next_greatest_element_fast (arr : list ) -> list :
29+ def next_greatest_element_fast (arr : list [ float ] ) -> list [ float ] :
2530 """
2631 Like next_greatest_element_slow() but changes the loops to use
2732 enumerate() instead of range(len()) for the outer loop and
@@ -31,7 +36,7 @@ def next_greatest_element_fast(arr: list) -> list:
3136 """
3237 result = []
3338 for i , outer in enumerate (arr ):
34- next = - 1
39+ next : float = - 1
3540 for inner in arr [i + 1 :]:
3641 if outer < inner :
3742 next = inner
@@ -40,7 +45,7 @@ def next_greatest_element_fast(arr: list) -> list:
4045 return result
4146
4247
43- def next_greatest_element (arr : list ) -> list :
48+ def next_greatest_element (arr : list [ float ] ) -> list [ float ] :
4449 """
4550 Get the Next Greatest Element (NGE) for all elements in a list.
4651 Maximum element present after the current one which is also greater than the
@@ -53,21 +58,19 @@ def next_greatest_element(arr: list) -> list:
5358 >>> next_greatest_element(arr) == expect
5459 True
5560 """
56- stack = []
57- result = [- 1 ] * len (arr )
61+ arr_size = len (arr )
62+ stack : list [float ] = []
63+ result : list [float ] = [- 1 ] * arr_size
5864
59- for index in reversed (range (len ( arr ) )):
60- if len ( stack ) :
65+ for index in reversed (range (arr_size )):
66+ if stack :
6167 while stack [- 1 ] <= arr [index ]:
6268 stack .pop ()
63- if len ( stack ) == 0 :
69+ if not stack :
6470 break
65-
66- if len (stack ) != 0 :
71+ if stack :
6772 result [index ] = stack [- 1 ]
68-
6973 stack .append (arr [index ])
70-
7174 return result
7275
7376
0 commit comments