算法 - 贪心04(Swift版本)

68 阅读2分钟

重叠区间系列

题目1:452. 用最少数量的箭引爆气球

讲解
leetcode

// @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. 无重叠区间

讲解
leetcode

《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.划分字母区间

讲解
leetcode

记录每个字符最后出现的位置,然后一直根据字符最后出现的位置 更新当前串的尾部位置
如果尾部位置正好就是当前位置, 那就说明找到了一段。

// @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