Skip to content

Commit f924f3e

Browse files
authored
Create maximal-network-rank.py
1 parent f87a70c commit f924f3e

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

Python/maximal-network-rank.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Time: O(nlogn) ~ O(n^2)
2+
# Space: O(n + m)
3+
4+
# optimized from Solution2
5+
class Solution(object):
6+
def maximalNetworkRank(self, n, roads):
7+
"""
8+
:type n: int
9+
:type roads: List[List[int]]
10+
:rtype: int
11+
"""
12+
degree = [0]*n
13+
adj = collections.defaultdict(set)
14+
for a, b in roads:
15+
degree[a] += 1
16+
degree[b] += 1
17+
adj[a].add(b)
18+
adj[b].add(a)
19+
sorted_idx = range(n)
20+
sorted_idx.sort(key=lambda x:-degree[x])
21+
m = 2
22+
while m < n:
23+
if degree[sorted_idx[m]] != degree[sorted_idx[1]]:
24+
break
25+
m += 1
26+
result = degree[sorted_idx[0]] + degree[sorted_idx[1]] - 1 # at least sum(top2 values) - 1
27+
for i in xrange(m-1): # only need to check pairs of top2 values
28+
for j in xrange(i+1, m):
29+
if degree[sorted_idx[i]]+degree[sorted_idx[j]]-int(sorted_idx[i] in adj and sorted_idx[j] in adj[sorted_idx[i]]) > result: # if equal to ideal sum of top2 values, break
30+
return degree[sorted_idx[i]]+degree[sorted_idx[j]]-int(sorted_idx[i] in adj and sorted_idx[j] in adj[sorted_idx[i]])
31+
return result
32+
33+
34+
# Time: O(n^2)
35+
# Space: O(n + m)
36+
class Solution2(object):
37+
def maximalNetworkRank(self, n, roads):
38+
"""
39+
:type n: int
40+
:type roads: List[List[int]]
41+
:rtype: int
42+
"""
43+
degree = [0]*n
44+
adj = collections.defaultdict(set)
45+
for a, b in roads:
46+
degree[a] += 1
47+
degree[b] += 1
48+
adj[a].add(b)
49+
adj[b].add(a)
50+
result = 0
51+
for i in xrange(n-1):
52+
for j in xrange(i+1, n):
53+
result = max(result, degree[i]+degree[j]-int(i in adj and j in adj[i]))
54+
return result

0 commit comments

Comments
 (0)