C++ 中查找右侧较小元素的数量

2024年8月28日 | 阅读 7 分钟

在本文中,我们将讨论如何使用 C++ 计算右侧较小元素,并提供几个示例。

下面是 N 维无序数组 arr[],它由唯一整数组成。我们的目标是创建一个名为 count 的第二个数组,其中 count 将更小。右侧小于 arr[i] 的元素数量将由 smaller[i] 变量表示。

示例

示例 1:

输入

N = 5, arr[] = {7, 4, 6, 2, 1}

输出

{3, 2, 2, 1, 0}

说明

  • 对于 arr[0],右侧有三个元素小于 7,它们是 {4, 6, 2}。
  • 对于 arr[1],右侧有两个元素小于 4,它们是 {2, 1}。
  • 对于 arr[2],右侧有两个元素小于 6,它们是 {2, 1}。
  • 对于 arr[3],右侧有一个元素小于 2,它是 {1}。
  • 对于 arr[4],右侧没有更小的元素。

示例 2

输入

N=5, arr[] = {7, 1, 5, 2, 10}

输出

{3, 0, 0, 2, 0}

说明

  • 对于 arr[0],右侧有三个元素更小。
  • 对于 arr[1],右侧有 0 个元素更小。
  • 对于 arr[2],右侧有 0 个元素更小。
  • 对于 arr[3],右侧有两个元素更小。
  • 对于 arr[4],右侧有 0 个元素更小。

方法 1:暴力法

  • 在此方法中,我们将创建一个名为 countSmaller[] 的数组,并将每个元素右侧的较小元素存储起来,这将是解决此问题的暴力法。
  • 对于每个元素,将使用嵌套的 for 循环计算右侧较小元素的数量。
  • 每当当前元素右侧出现一个元素时,我们都会增加计数。当循环完成时,我们将 countSmaller[i] 赋值为该计数的值。
  • 在两个循环完成后,将打印 countSmaller 数组。

C++ 实现

输出

4 2 3 0 0 0

方法 2:使用自平衡 BST

  • 我们将使用自平衡 BST 以 O(N(log(n))) 的时间复杂度解决此问题。
  • 我们将从左到右遍历数组以将这些组件添加到树中。
  • 插入新键时,我们将首先将其与根节点进行比较。如果键大于根节点,则根节点左子树的所有节点都将大于该键。
  • 因此,我们将通过 左子树 的大小来增加要插入键的较小元素的数量。
  • 我们将递归地对树的所有节点重复此过程。

C++ 实现

输出

Input: arr[] = {5, 3, 6, 1, 9}  
Output: 2 1 1 0 0

方法 3:带有两个附加字段的 BST

  • 二叉搜索树 将包含两个附加字段,其中包括:一个字段将存储节点 左侧 的元素,第二个字段将存储它们的频率。
  • 这些元素将通过从右到左遍历数组添加到树中。
  • 当插入新键时,将计算小于当前元素的项目数。我们只需计算当前节点左侧的组件数量及其频率之和即可。
  • 一旦元素处于正确位置,我们就可以计算其和。
  • 将对树中的每个节点重复此过程。

程序

输出

4 2 4 1 1 0

结论

在本文中,讨论了计算右侧较小元素的问题。我们研究了解决此问题的三种方法:暴力法、自平衡 BST,以及最后一种方法,它也是最优的,但采用了带有两个附加字段的 BST。