File tree Expand file tree Collapse file tree 5 files changed +240
-0
lines changed
longest-palindromic-substring
number-of-connected-components-in-an-undirected-graph Expand file tree Collapse file tree 5 files changed +240
-0
lines changed Original file line number Diff line number Diff line change 1+ """
2+ 261. Graph Valid Tree
3+ https://leetcode.com/problems/graph-valid-tree/
4+
5+ Solution:
6+ To solve this problem, we can use the depth-first search (DFS) algorithm.
7+ We can create an adjacency list to represent the graph.
8+ Then, we can perform a DFS starting from node 0 to check if all nodes are visited.
9+ If all nodes are visited, we return True; otherwise, we return False.
10+
11+ Time complexity: O(n)
12+ - We visit each node once.
13+ - The DFS has a time complexity of O(n).
14+
15+ Space complexity: O(n)
16+ - We use an adjacency list to store the graph.
17+ - The space complexity is O(n) for the adjacency list.
18+ """
19+
20+
21+ from typing import List
22+
23+
24+ class Solution :
25+ def validTree (self , n : int , edges : List [List [int ]]) -> bool :
26+ if len (edges ) != n - 1 :
27+ return False
28+
29+ # Initialize adjacency list
30+ graph = {i : [] for i in range (n )}
31+ for a , b in edges :
32+ graph [a ].append (b )
33+ graph [b ].append (a )
34+
35+ # Function to perform DFS
36+ def dfs (node , parent ):
37+ visited .add (node )
38+ for neighbor in graph [node ]:
39+ if neighbor == parent :
40+ continue
41+ if neighbor in visited or not dfs (neighbor , node ):
42+ return False
43+ return True
44+
45+ visited = set ()
46+
47+ # Start DFS from node 0
48+ if not dfs (0 , - 1 ):
49+ return False
50+
51+ # Check if all nodes are visited
52+ return len (visited ) == n
Original file line number Diff line number Diff line change 1+ """
2+ 213. House Robber II
3+ https://leetcode.com/problems/house-robber-ii/
4+
5+ Solution:
6+ To solve this problem, we can use the dynamic programming approach.
7+ We can create a helper function to solve the house robber problem for a given range of houses.
8+ We consider two cases:
9+ - Rob houses from 0 to n-2.
10+ - Rob houses from 1 to n-1.
11+ We return the maximum amount of money that can be robbed from these two cases.
12+
13+ Time complexity: O(n)
14+ - We iterate through each house once.
15+ - The helper function has a time complexity of O(n).
16+
17+ Space complexity: O(n)
18+ - We use a dynamic programming array to store the maximum amount of money that can be robbed.
19+ - The space complexity is O(n) for the dynamic programming array.
20+
21+ """
22+
23+ from typing import List
24+
25+
26+ class Solution :
27+ def rob (self , nums : List [int ]) -> int :
28+ def rob_linear (houses ):
29+ if not houses :
30+ return 0
31+ if len (houses ) == 1 :
32+ return houses [0 ]
33+ dp = [0 ] * len (houses )
34+ dp [0 ] = houses [0 ]
35+ dp [1 ] = max (houses [0 ], houses [1 ])
36+ for i in range (2 , len (houses )):
37+ dp [i ] = max (dp [i - 1 ], houses [i ] + dp [i - 2 ])
38+ return dp [- 1 ]
39+
40+ n = len (nums )
41+ if n == 1 :
42+ return nums [0 ]
43+ if n == 2 :
44+ return max (nums [0 ], nums [1 ])
45+
46+ # Case 1: Rob houses from 0 to n-2
47+ case1 = rob_linear (nums [:- 1 ])
48+ # Case 2: Rob houses from 1 to n-1
49+ case2 = rob_linear (nums [1 :])
50+
51+ return max (case1 , case2 )
Original file line number Diff line number Diff line change 1+ """
2+ 198. House Robber
3+ https://leetcode.com/problems/house-robber/
4+
5+ Solution:
6+ To solve this problem, we can use the dynamic programming approach.
7+ We can create a dynamic programming array to store the maximum amount of money that can be robbed.
8+ We consider two cases:
9+ - Rob the current house and the house two steps back.
10+ - Skip the current house and rob the house one step back.
11+ We return the maximum amount of money that can be robbed from these two cases.
12+
13+ Time complexity: O(n)
14+ - We iterate through each house once.
15+ - The dynamic programming array has a time complexity of O(n).
16+
17+ Space complexity: O(n)
18+ - We use a dynamic programming array to store the maximum amount of money that can be robbed.
19+ - The space complexity is O(n) for the dynamic programming array.
20+ """
21+
22+ from typing import List
23+
24+
25+ class Solution :
26+ def rob (self , nums : List [int ]) -> int :
27+ if not nums :
28+ return 0
29+ if len (nums ) == 1 :
30+ return nums [0 ]
31+
32+ n = len (nums )
33+ dp = [0 ] * n
34+ dp [0 ] = nums [0 ]
35+ dp [1 ] = max (nums [0 ], nums [1 ])
36+
37+ for i in range (2 , n ):
38+ dp [i ] = max (dp [i - 1 ], nums [i ] + dp [i - 2 ])
39+
40+ return dp [- 1 ]
Original file line number Diff line number Diff line change 1+ """
2+ 5. Longest Palindromic Substring
3+ https://leetcode.com/problems/longest-palindromic-substring/
4+
5+ Solution:
6+ To solve this problem, we can use the expand from center approach.
7+ We can iterate through each character in the string and expand around it to find palindromes.
8+ We handle both odd-length and even-length palindromes by checking two cases.
9+ We return the longest palindrome found.
10+
11+ Time complexity: O(n^2)
12+ - We iterate through each character in the string.
13+ - For each character, we expand around it to find palindromes.
14+
15+ Space complexity: O(1)
16+ - We use constant space to store the maximum palindrome found.
17+
18+ """
19+
20+
21+ class Solution :
22+ def longestPalindrome (self , s : str ) -> str :
23+ if len (s ) <= 1 :
24+ return s
25+
26+ def expand_from_center (left , right ):
27+ while left >= 0 and right < len (s ) and s [left ] == s [right ]:
28+ left -= 1
29+ right += 1
30+ return s [left + 1 : right ]
31+
32+ max_str = s [0 ]
33+
34+ for i in range (len (s ) - 1 ):
35+ odd = expand_from_center (i , i )
36+ even = expand_from_center (i , i + 1 )
37+
38+ if len (odd ) > len (max_str ):
39+ max_str = odd
40+ if len (even ) > len (max_str ):
41+ max_str = even
42+
43+ return max_str
Original file line number Diff line number Diff line change 1+ """
2+ 323. Number of Connected Components in an Undirected Graph
3+ https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/
4+
5+ Solution:
6+ To solve this problem, we can use the depth-first search (DFS) algorithm.
7+ We can create an adjacency list to represent the graph.
8+ Then, we can perform a DFS starting from each node to count the number of connected components.
9+ We keep track of visited nodes to avoid revisiting nodes.
10+ The number of connected components is the number of times we perform DFS.
11+
12+ Time complexity: O(n+m)
13+ - We visit each node and edge once.
14+ - The DFS has a time complexity of O(n+m).
15+
16+ Space complexity: O(n+m)
17+ - We use an adjacency list to store the graph.
18+ - The space complexity is O(n+m) for the adjacency list and visited set.
19+
20+ """
21+
22+ from typing import List
23+
24+
25+ class Solution :
26+ def countComponents (self , n : int , edges : List [List [int ]]) -> int :
27+ # Initialize the graph as an adjacency list
28+ graph = {i : [] for i in range (n )}
29+ for a , b in edges :
30+ graph [a ].append (b )
31+ graph [b ].append (a )
32+
33+ # Set to keep track of visited nodes
34+ visited = set ()
35+
36+ # Function to perform DFS
37+ def dfs (node ):
38+ stack = [node ]
39+ while stack :
40+ current = stack .pop ()
41+ for neighbor in graph [current ]:
42+ if neighbor not in visited :
43+ visited .add (neighbor )
44+ stack .append (neighbor )
45+
46+ # Count connected components
47+ count = 0
48+ for i in range (n ):
49+ if i not in visited :
50+ count += 1
51+ visited .add (i )
52+ dfs (i )
53+
54+ return count
You can’t perform that action at this time.
0 commit comments