返回

图解LeetCode——剑指 Offer II 115. 重建序列(通俗易懂)

后端

引言

剑指 Offer II 115. 重建序列

给你一个数组 nums ,数组 nums 中的元素 0 <= nums[i] < n ,其中 n 是 nums 的大小。你能否根据数组 nums 重建一个排列 nums[0], nums[1], nums[2], ..., nums[n-1] ,使得 nums[i] < nums[j] 当且仅当 i < j

输入: nums = [1,0,2]
输出: [0,1,2]
示例 2:

输入: nums = [3,0,1]
输出: [0,1,3]

思路

本题需要找到一种方法,将给定数组 nums 重建为一个排列,使得 nums[i] < nums[j] 当且仅当 i < j。

这个问题可以用贪心算法解决。我们首先初始化一个结果数组 result,并将 nums[0] 放在 result 的第一个位置。接下来,我们遍历数组 nums,对于每个元素 nums[i],我们将其插入到 result 中,使得 result[i-1] < result[i]。这样,我们就保证了最终的排列满足题目的要求。

例如,对于示例 1 中的数组 nums = [1, 0, 2],我们首先将 nums[0] = 1 放入 result 的第一个位置。接下来,我们考虑 nums[1] = 0,由于 0 < 1,因此我们将 nums[1] 插入到 result 的第二个位置。最后,我们考虑 nums[2] = 2,由于 2 > 0,因此我们将 nums[2] 插入到 result 的第三个位置。最终,我们得到结果 result = [0, 1, 2]。

代码

def reconstruct_sequence(nums):
  """
  重建一个排列 nums[0], nums[1], nums[2], ..., nums[n-1],使得 nums[i] < nums[j] 当且仅当 i < j

  参数:
    nums: 输入数组

  返回值:
    重建后的排列
  """

  # 初始化结果数组
  result = []

  # 将 nums[0] 放入 result 的第一个位置
  result.append(nums[0])

  # 遍历数组 nums
  for i in range(1, len(nums)):
    # 找到 nums[i] 在 result 中的正确位置
    j = 0
    while j < len(result) and nums[i] > result[j]:
      j += 1

    # 将 nums[i] 插入到 result 中
    result.insert(j, nums[i])

  return result


# 测试
nums = [1, 0, 2]
print(reconstruct_sequence(nums))  # [0, 1, 2]

nums = [3, 0, 1]
print(reconstruct_sequence(nums))  # [0, 1, 3]

总结

本题是一道中等难度的贪心算法题目。通过本题,我们可以学习到如何使用贪心算法解决实际问题。

拓展阅读

  1. LeetCode 1035. 不相交的线
  2. LeetCode 452. 用最少数量的箭引爆气球
  3. LeetCode 334. 递增的三元子序列