1. Non-overlapping Intervals (Leetcode Number: 435)
Sort the array by the value of left end (1st priority) & right end (2nd priority) -> Start from the second element, check if two intervals are overlapped, if yes, check the right end value
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key = lambda x: (x[0], x[1]))
count = 0
left, right = intervals[0][0], intervals[0][1]
for i in range(1, len(intervals)):
if intervals[i][0] < right:
count += 1
if intervals[i][1] < right:
# This left end update could be hided
left = intervals[i][0]
right = intervals[i][1]
else:
left = intervals[i][0]
right = intervals[i][1]
return count
2. Partition Labels (Leetcode Number: 763)
The point is finding the respective last indexs of all the letters in the string and split the string accordingly. The issue is getting stuck at the set comprehension syntax step.
class Solution(object):
def partitionLabels(self, S):
last_id = {st: i for i, st in enumerate(S)}
left, right = 0, 0
res = []
for i, st in enumerate(S):
right = max(right, last_id[st])
if i == right :
res.append(i - left + 1)
left = i + 1
return res
3. Merge Intervals (Leetcode Number: 56)
Two conner cases:
a. Length of the list is 1
b. Deal with the last element in the list
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key = lambda x: (x[0], x[1]))
res = []
left, right = intervals[0][0], intervals[0][1]
if len(intervals) == 1:
res.append([left, right])
for i in range(1, len(intervals)):
if intervals[i][0] <= right:
right = max(right, intervals[i][1])
else:
res.append([left, right])
left = intervals[i][0]
right = intervals[i][1]
if i == len(intervals) - 1:
res.append([left, right])
return res