LeetCode 周赛 353:走进 LIS 最长递增子序列的幽深之处
2022-12-02 05:09:52
LIS 的巧妙伪装:解开 LeetCode 周赛 353 T1 和 T2 的谜团
1. 问题的提出:LIS 的隐形身影
LeetCode 周赛 353 的 T1 和 T2 乍一看似乎与 LIS 最长递增子序列无关。然而,深入剖析,我们会发现这两道题都暗藏着 LIS 的影子,只是以一种更微妙的方式呈现。
2. T1:最大可达成数字与 LIS 的巧妙联系
T1 要求我们找出最大的可达成数字,看似与 LIS 无关。但进一步分析,我们发现两者之间存在微妙的联系。
将给定的数字字符串视为一个数组,其中每个数字是一个元素。LIS 的概念就在此处派上用场。我们可以将 LIS 视为这个数字数组中所有递增子序列的集合。而最大的可达成数字,正是这个 LIS 中最大的元素。
因此,解决 T1 问题的关键在于找到这个数字数组中的最长递增子序列,并找出其中最大的元素。这正是 LIS 的精髓。
3. T2:LIS 的贪心算法与二分查找的联袂出演
T2 要求我们确定达到末尾下标所需的最大跳跃次数,乍看之下与 LIS 无关。但实际上,我们可以巧妙地运用 LIS 的贪心算法和二分查找,轻松解决它。
贪心算法的核心思想是,在每次跳跃中选择能够让我们距离末尾下标最近的石块。这与 LIS 的贪心算法有着异曲同工之妙。在 LIS 中,我们选择递增子序列中最大的元素,而在 T2 中,我们选择距离末尾下标最近的石块。
二分查找则是我们快速找到距离末尾下标最近石块的利器。通过二分查找,我们可以快速缩小搜索范围,并最终找到最优解。
4. LIS 的强大魅力:从 LeetCode 周赛到算法竞赛
LIS 最长递增子序列是一个基础而重要的算法问题,不仅在 LeetCode 周赛中频频出现,在算法竞赛中也是常客。掌握 LIS 的解题技巧,可以为你赢得算法竞赛奠定坚实的基础。
5. 结语
LeetCode 周赛 353 的 T1 和 T2 看似与 LIS 最长递增子序列毫不相关,但深入分析后,我们发现它们之间存在着微妙的联系。通过巧妙地运用 LIS 的贪心算法和二分查找,我们可以轻松解决这两道难题。希望本文能为算法爱好者带来启发,并帮助大家在 LeetCode 周赛和算法竞赛中取得更好的成绩。
常见问题解答
-
问:什么是 LIS 最长递增子序列?
答:LIS 是给定序列中递增子序列中最长的一个,它可以帮助我们找到数组中递增元素的集合。 -
问:如何解决 LeetCode 周赛 353 T1?
答:将给定数字字符串视为数组,使用 LIS 算法找到最长递增子序列,并从中找出最大的元素即可。 -
问:如何解决 LeetCode 周赛 353 T2?
答:可以使用 LIS 的贪心算法,在每次跳跃中选择距离末尾下标最近的石块。同时,利用二分查找快速找到最近的石块。 -
问:LIS 在算法竞赛中有哪些应用?
答:LIS 在算法竞赛中应用广泛,如最长公共子序列、俄罗斯套娃等问题中。 -
问:如何提高 LIS 解题能力?
答:多练习、掌握 LIS 的贪心算法和二分查找技巧,并多参加算法竞赛,积累实战经验。
代码示例
# T1:最大可达成数字
def max_achievable_number(digits):
lis = [digits[0]]
for digit in digits[1:]:
if digit > lis[-1]:
lis.append(digit)
return lis[-1]
# T2:最大跳跃次数
def min_jumps_to_end(stones):
pos, jumps = 0, 0
for stone in stones:
if pos < stone:
pos = max(pos, stone)
jumps += 1
return jumps