435. 无重叠区间
移除区间使得剩余的区间中没有重复的区间,如果想要利用贪心算法,那么需要去除重叠区间中的最大程度的区间。
主要思想: 记录分割区间,如果下一个区间与上一个区间发生重合,那么将这个区间的end值进行替换。
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
count = 0 # 记录重叠区间
lst = sorted(intervals,key=lambda x:x[0])
if len(lst) == 0:
return 0
for i in range(1,len(lst)):
if lst[i][0] < lst[i-1][1]: # 说明有重叠的区间
lst[i][1] = min(lst[i][1],lst[i-1][1])
count += 1
return count
763.划分字母区间
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
可以分为如下两步:
- 统计每一个字符最后出现的位置
- 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
用最远出现距离模拟了圈字符的行为
class Solution:
def partitionLabels(self, s: str) -> List[int]:
# 统计这个字符串的位置,然后利用位置的重叠关系得到对应不重合的子串
# 首先需要记录某一个字母出现的最远位置,通过这个位置来推测其他位置的字母有没有重合的部分。
# 想到重叠区间的问题,将本问题抽象成重叠区间的问题,如果是重叠区间的话,那么根据right的值判定这个区间中是否含right值
hash = [0] * 27
for i in range(len(s)):
hash[ord(s[i])-ord('a')] = i
result = []
left = 0
right = 0 # 找到字母出现的最远边界
for i in range(len(s)):
right = max(right,hash[ord(s[i])-ord('a')])
if i == right:
result.append(right-left+1)
left = i+1
return result
56. 合并区间
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 将列表保存在结果中,然后对结果进行遍历,在遍历结果的过程中对后一个数组进行比较得到该列表是否符合要求的结论。
result = []
if len(intervals) == 0 : return result
lst = sorted(intervals,key=lambda x : x[0])
result.append(lst[0]) #遍历后续的区间,如果发现重叠直接合并即可
index = 0
for i in range(1,len(lst)):
if lst[i][0] <= result[index][1]:
result[index][0] = min(lst[i][0],result[index][0])
result[index][1] = max(lst[i][1],result[index][1])
else:
result.append(lst[i])
index += 1
return result