返回

LeetCode 周赛 353:走进 LIS 最长递增子序列的幽深之处

闲谈

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