重叠区间系列
题目1:452. 用最少数量的箭引爆气球
// @lc code=start
class Solution {
// 依次取交集,如果开了新的集合 结果+1
func findMinArrowShots(_ points: [[Int]]) -> Int {
if points.count == 0 { return 0 }
var points = points.sorted { $0[0] < $1[0] }
var res = 1
print("\(points)")
for i in 1..<points.count {
if points[i][0] > points[i - 1][1] {
// 当前气球范围就不用改了
res += 1
} else {
// 当前气球右边界更新一下
points[i][1] = min(points[i][1], points[i - 1][1])
}
}
return res
}
}
// @lc code=end
排序后尽可能的一箭击中尽可能多的气球。
题目2:435. 无重叠区间
《452.用最少数量的箭引爆气球》 题目求的是非重叠区间个数, 用总数减去非重叠区间个数 即为当前题目答案
// @lc code=start
class Solution {
func eraseOverlapIntervals(_ intervals: [[Int]]) -> Int {
if intervals.count == 1 { return 0 }
var intervals = intervals.sorted { $0[0] < $1[0] }
var res = 1
for i in 1..<intervals.count {
// 不重叠,注意这里的判断等于 认为不重叠
if intervals[i][0] >= intervals[i - 1][1] {
res += 1
} else {
intervals[i][1] = min(intervals[i][1], intervals[i - 1][1])
}
}
return intervals.count - res
}
}
// @lc code=end
题目3: 763.划分字母区间
记录每个字符最后出现的位置,然后一直根据字符最后出现的位置 更新当前串的尾部位置
如果尾部位置正好就是当前位置, 那就说明找到了一段。
// @lc code=start
class Solution {
func partitionLabels(_ s: String) -> [Int] {
var set = Array(repeating: 0, count: 26)
let first = Int(Character("a").asciiValue!)
// 记录每个字符最后出现的位置
for (i, char) in s.enumerated() {
set[Int(char.asciiValue!) - first] = i
}
var left = 0, right = 0
var res = [Int]()
// 遍历字符串并划分区间
for (i, char) in s.enumerated() {
right = max(right, set[Int(char.asciiValue!) - first])
if right == i {
res.append(right - left + 1)
left = i + 1
}
}
return res
}
}
// @lc code=end