在 Python 中找到反序倒置

在 Python 中找到反序倒置

假设我们有一个数字列表 nums。我们必须找到现有四元组(a,b,c,d),使得 a < b < c < d 且 nums[a] < nums[b] 和 nums[c] > nums[d]。

数组 nums 是整数 1…N 的一个排列。

因此,如果输入为 nums = [3,4,7,6,5],则输出将是5。

从给定的输入中,我们有这些反转倒置−

  • 3, 4, 7, 6

  • 3, 4, 6, 5

  • 3, 4, 7, 5

  • 3, 7, 6, 5

  • 4, 7, 6, 5

要解决此问题,我们将按以下步骤进行−

  • m := 10^9 + 7

  • 如果 nums 的大小小于 4,则

    • 返回0
  • n := nums 的大小

  • sorted_ds := 一个新列表

  • 在 sorted_ds 中插入 nums 的最后一项

  • 排序列表 sorted_ds

  • ds_smaller_than_c := [0] * n

  • 对于 c in range(n − 2, -1),递减做

    • ds_smaller_than_c[c] := 返回 sorted_ds 中 nums[c] – 1 可以插入并 维护排序顺序的最右端位置

    • 在 sorted_ds 的末尾插入 nums[c]

    • 排序列表 sorted_ds

  • quadruplet_count := 0

  • sorted_as := 一个新列表

  • 在 sorted_as 中插入 nums 的第一个数字

  • 按排序顺序排序列表 sorted_as

  • as_smaller_than_b_sum := 0

  • 对于 b in range(1, n − 2),做

    • as_smaller_than_b_sum := as_smaller_than_b_sum + sorted_as 中 nums[b] – 1 可以插入并维护顺序 的最右位置

    • 排序列表 sorted_as

    • as_smaller_than_b_sum := as_smaller_than_b_sum mod m

    • 在 sorted_as 的末尾插入 nums[b]

    • 排序列表 sorted_as

    • quadruplet_count := quadruplet_count + as_smaller_than_b_sum * ds_smaller_than_c[b + 1]

    • quadruplet_count := quadruplet_count mod m

  • 返回 quadruplet_count

让我们看一下以下实现以获得更好的理解−

示例

import bisect
MOD = 10 ** 9 + 7
class Solution:
   def solve(self, nums):
      if len(nums) < 4:
         return 0
      n = len(nums)
      sorted_ds = list([nums[−1]])
      sorted_ds.sort()
      ds_smaller_than_c = [0] * n
      for c in range(n − 2, −1, −1):
         ds_smaller_than_c[c] = bisect.bisect_right(sorted_ds, nums[c] − 1)
         sorted_ds.append(nums[c])
         sorted_ds.sort()
      quadruplet_count = 0
      sorted_as = list([nums[0]])
      sorted_as.sort()
      as_smaller_than_b_sum = 0
      for b in range(1, n − 2):
         as_smaller_than_b_sum += bisect.bisect_right(sorted_as, nums[b] − 1)
         sorted_as.sort()
         as_smaller_than_b_sum %= MOD
         sorted_as.append(nums[b])
         sorted_as.sort()
         quadruplet_count += as_smaller_than_b_sum * ds_smaller_than_c[b + 1]
         quadruplet_count %= MOD
      return quadruplet_count
ob = Solution()
print(ob.solve([3, 4, 7, 6, 5]))

输入

[3, 4, 7, 6, 5]

输出

5

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程