File tree Expand file tree Collapse file tree 5 files changed +149
-0
lines changed
best-time-to-buy-and-sell-stock
implement-trie-prefix-tree Expand file tree Collapse file tree 5 files changed +149
-0
lines changed Original file line number Diff line number Diff line change
1
+ // TC: O(n^2)
2
+ // SC: O(n)
3
+ public class Solution {
4
+ public List <List <Integer >> threeSum (int [] nums ) {
5
+
6
+ Arrays .sort (nums );
7
+
8
+ List <List <Integer >> output = new ArrayList <>();
9
+ Map <Integer , Integer > map = new HashMap <>();
10
+
11
+ for (int i = 0 ; i < nums .length ; ++i ) map .put (nums [i ], i );
12
+
13
+ for (int i = 0 ; i < nums .length - 2 ; ++i ) {
14
+ if (nums [i ] > 0 ) break ;
15
+
16
+ for (int j = i + 1 ; j < nums .length - 1 ; ++j ) {
17
+ int cValue = -1 * (nums [i ] + nums [j ]);
18
+
19
+ if (map .containsKey (cValue ) && map .get (cValue ) > j ) {
20
+ output .add (List .of (nums [i ], nums [j ], cValue ));
21
+ }
22
+ j = map .get (nums [j ]);
23
+ }
24
+
25
+ i = map .get (nums [i ]);
26
+ }
27
+
28
+ return output ;
29
+ }
30
+ }
Original file line number Diff line number Diff line change
1
+ // TC: O(n)
2
+ // SC: O(1)
3
+ class Solution {
4
+ public int maxProfit (int [] prices ) {
5
+ int bestProfit = 0 ;
6
+ int buyPrice = prices [0 ];
7
+ for (int i = 1 ; i < prices .length ; i ++) {
8
+ if (buyPrice > prices [i ]) {
9
+ buyPrice = prices [i ];
10
+ continue ;
11
+ }
12
+ bestProfit = Math .max (bestProfit , prices [i ] - buyPrice );
13
+ }
14
+ return bestProfit ;
15
+ }
16
+ }
Original file line number Diff line number Diff line change
1
+ // TC: O(n * m log m)
2
+ // SC: O(n * m)
3
+ class Solution {
4
+ public List <List <String >> groupAnagrams (String [] strs ) {
5
+ List <List <String >> output = new ArrayList <>();
6
+ Map <String , List <String >> map = new HashMap <>();
7
+
8
+ for (int i = 0 ; i < strs .length ; i ++) {
9
+ char [] charArray = strs [i ].toCharArray ();
10
+ Arrays .sort (charArray );
11
+ String target = new String (charArray );
12
+
13
+ if (map .containsKey (target )) {
14
+ map .get (target ).add (strs [i ]);
15
+ } else {
16
+ List <String > inside = new ArrayList <>();
17
+ inside .add (strs [i ]);
18
+ map .put (target , inside );
19
+ }
20
+ }
21
+
22
+ for (String key : map .keySet ()) output .add (map .get (key ));
23
+ return output ;
24
+ }
25
+ }
Original file line number Diff line number Diff line change
1
+ class TrieNode {
2
+ TrieNode [] children ;
3
+ boolean isEndOfWord ;
4
+
5
+ public TrieNode () {
6
+ children = new TrieNode [26 ];
7
+ isEndOfWord = false ;
8
+ }
9
+ }
10
+
11
+ class Trie {
12
+
13
+ private TrieNode root ;
14
+
15
+ public Trie () {
16
+ root = new TrieNode ();
17
+ }
18
+
19
+ // TC: O(n)
20
+ // SC: O(n * m)
21
+ // -> word length * new TrieNode spaces
22
+ public void insert (String word ) {
23
+ TrieNode node = root ;
24
+ for (char c : word .toCharArray ()) {
25
+ int idx = c - 'a' ;
26
+ if (node .children [idx ] == null ) {
27
+ node .children [idx ] = new TrieNode ();
28
+ }
29
+ node = node .children [idx ];
30
+ }
31
+ node .isEndOfWord = true ;
32
+ }
33
+
34
+ // TC: O(n)
35
+ // SC: O(1)
36
+ public boolean search (String word ) {
37
+ TrieNode node = searchPrefix (word );
38
+ return node != null && node .isEndOfWord ;
39
+ }
40
+
41
+ // TC: O(n)
42
+ // SC: O(1)
43
+ private TrieNode searchPrefix (String word ) {
44
+ TrieNode node = root ;
45
+ for (char c : word .toCharArray ()) {
46
+ int idx = c - 'a' ;
47
+ if (node .children [idx ] == null ) return null ;
48
+ node = node .children [idx ];
49
+ }
50
+ return node ;
51
+ }
52
+
53
+ public boolean startsWith (String prefix ) {
54
+ return searchPrefix (prefix ) != null ;
55
+ }
56
+ }
Original file line number Diff line number Diff line change
1
+ // TC: O(n^2)
2
+ // -> use 2 for-loops to search
3
+ // SC: O(n)
4
+ // -> boolean array's size
5
+ class Solution {
6
+ public boolean wordBreak (String s , List <String > wordDict ) {
7
+ Set <String > set = new HashSet (wordDict );
8
+
9
+ boolean [] dp = new boolean [s .length () + 1 ];
10
+ dp [0 ] = true ;
11
+
12
+ for (int i = 1 ; i <= s .length (); i ++) {
13
+ for (int j = 0 ; j < i ; j ++) {
14
+ if (dp [j ] && set .contains (s .substring (j , i ))) {
15
+ dp [i ] = true ;
16
+ break ;
17
+ }
18
+ }
19
+ }
20
+ return dp [s .length ()];
21
+ }
22
+ }
You can’t perform that action at this time.
0 commit comments