1.贪心策略:
我采取如下策略:
排序:将所有区间按右端点从小到大排序。
选点:遍历排序后的区间,如果当前区间左端点大于上一个选的点,则在当前区间右端点选一个新点。
核心思想:每次选右端点,可以最大化覆盖后续区间的可能性,从而最小化总点数。
2.证明贪心算法满足贪心选择性质:
贪心选择性质: 存在一个最优解,其第一个点选在所有区间中右端点最小的区间的右端点。
证明:
贪心选择性质定义:局部最优选择能推导出全局最优解。证明:假设最优解S的第一个选点覆盖区间[a,b],设右端点最小的区间为[c,d]。由于d最小,[c,d]未被S的第一个选点覆盖,故S中必有选点y覆盖[c,d]。将S的第一个选点替换为y,得到新解S':y覆盖[c,d],且因y ≤ d < b,所有被原选点覆盖的区间仍被y覆盖,S'选点数量与S相同,仍是最优解。由此证明,选择最小右端点区间的右端点作为选点这一局部最优选择,可推导出全局最优解,满足贪心选择性质。
3.时间复杂度分析:
排序:O(n log n)(主要开销)
扫描选点:O(n)(一次遍历)
总时间复杂度:O(n log n)
4.理解:
贪心算法是一种每一步都采取当前状态下最优选择,希望通过局部最优达到全局最优的算法思想。
适用条件:
贪心选择性质: 每一步的局部最优选择能构成全局最优解的一部分。
最优子结构: 问题的最优解包含子问题的最优解。
局限性:
并非所有问题都适用(如 0-1 背包问题用贪心可能得不到最优解)。
无法回溯,一旦选择不可更改。
对问题结构要求高,需要明确的局部最优规则。
优点:
思路简单,代码简洁,时间复杂度通常较低。