The key idea is to use a set for O(1) lookups. For each number, expand left and right to find the full consecutive range, marking numbers as visited to avoid redundant work.
classSolution {
publicint[]largestRange(int[] arr) {
Set<Integer> s =new HashSet<>();
for (int num : arr) s.add(num);
Set<Integer> visited =new HashSet<>();
int maxLen = 0, ansL = 0, ansR = 0;
for (int num : arr) {
if (visited.contains(num)) continue;
int l = num, r = num;
while (s.contains(l-1)) l--;
while (s.contains(r+1)) r++;
for (int i = l; i <= r; i++) visited.add(i);
if (r-l+1 > maxLen) {
maxLen = r-l+1; ansL = l; ansR = r;
}
}
return maxLen == 0 ?null : newint[]{ansL, ansR};
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution:
deflargest_range(self, arr: list[int]) -> tuple[int, int] |None:
s = set(arr)
visited = set()
max_len, ans_l, ans_r =0, 0, 0for num in arr:
if num in visited:
continue l, r = num, num
while l-1in s:
l -=1while r+1in s:
r +=1for i in range(l, r+1):
visited.add(i)
if r-l+1> max_len:
max_len = r-l+1 ans_l, ans_r = l, r
return (ans_l, ans_r) if max_len elseNone