动态规划与贪心算法:计算数字个数与区间移除问题

需积分: 0 0 下载量 41 浏览量 更新于2024-08-04 收藏 78KB DOCX 举报
"代码解析3" 在这个代码解析中,我们主要讨论了两个编程问题,一个是使用动态规划计算各位数字都不同的非负整数的数量,另一个是通过贪心算法解决区间覆盖问题。 对于第一个问题,我们需要计算长度为n的数字中,各位数字都不相同的数字个数。这里采用动态规划的方法来解决。状态dp[i]表示长度为i的数字中含重复位数的数字总数。初始化dp[1]=0,因为长度为1的数字中没有重复的情况。状态转移方程由两种情况构成:如果前i-1位有重复数字,最后一位可以是0-9中的任意一个;如果前i-1位没有重复,最后一位必须是前i位中的一个。因此,dp[i]等于10倍的dp[i-1]加上(9乘以10^(i-2)减去dp[i-1])乘以(i-1),这是因为在不含重复位数的数字基础上增加一位可能重复的数字。最后,我们要找的是长度为1到n的无重复数字的总和,即10^n减去所有含重复数字的总和。 第二个问题涉及区间覆盖,目标是最小化移除区间以达到无重叠的状态。采用贪心策略,首先按结束时间对区间排序,然后从头到尾遍历,每次检查当前区间是否与前一个区间重叠。如果重叠,就移除当前区间,否则保留。这样可以确保始终保留结束时间最早的区间,从而最大化未覆盖的部分。 在代码实现上,第一个问题的时间复杂度是O(n),因为主要操作是对n的循环,空间复杂度也是O(n),用于存储动态规划的状态。对于第二个问题,排序的时间复杂度是O(n log n),遍历的复杂度是O(n),所以总的时间复杂度接近O(n log n),空间复杂度取决于排序使用的数据结构,通常为O(n)。 测试用例展示了算法的正确性,例如输入2时,预期输出91,实际输出相符,证明算法正确计算了长度为2的无重复数字个数。同样,对于区间覆盖问题,边界测试如输入1和0也得到了预期结果。 这两个问题展示了动态规划和贪心算法在解决不同问题上的应用,动态规划用于优化状态之间的转换,贪心算法则用于寻找局部最优解来达到全局最优。理解并熟练运用这些算法对于解决复杂问题至关重要。