Python程序:检查列表是否可以拆分为连续递增的子列表


假设我们有一个名为nums的数字列表,该列表按非递减顺序排序,我们必须检查它是否可以拆分为任意数量的子序列,使得每个子序列至少有3个长度且连续递增。

因此,如果输入类似于nums = [2, 3, 4, 4, 5, 6, 7],则输出将为True,因为我们可以将列表拆分为[2, 3, 4]和[4, 5, 6, 7]。

为了解决这个问题,我们将遵循以下步骤:

  • counts := 一个包含nums的元素及其计数的映射
  • starts := 一个新的列表
  • ends := 一个新的列表
  • 对于count中项目的每个x(按排序顺序),执行:
    • 如果count[x] > count[x - 1],则
      • l := 大小为(count[x] - count[x - 1])的列表,并用x填充
      • 将l插入starts
    • 如果count[x] > count[x + 1],则
      • l := 大小为(count[x] - count[x + 1])的列表,并用x填充
      • 将l插入starts
  • 当所有(start, end)对满足(start + 2 <= end)时返回true,否则返回false

示例(Python)

让我们看看下面的实现,以便更好地理解:

 在线演示

from collections import Counter
class Solution:
   def solve(self, nums):
      count = Counter(nums)
      starts = []
      ends = []
      for x in sorted(count):
         if count[x] > count[x - 1]:
            starts.extend([x] * (count[x] - count[x - 1]))
         if count[x] > count[x + 1]:
            ends.extend([x] * (count[x] - count[x + 1]))
      return all(s + 2 <= e for s, e in zip(starts, ends))
ob = Solution()
nums = [2, 3, 4, 4, 5, 6, 7]
print(ob.solve(nums))

输入

[6, 7, 5, 10, 13], 2

输出

True

更新于:2020年12月12日

311 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告