C++程序,用于计算数组元素大于其左侧所有元素且至少有K个元素在其右侧的数量

c++程序,用于计算数组元素大于其左侧所有元素且至少有k个元素在其右侧的数量

字符串是一个对象,它表示数据字符的序列。字符串是始终表示为文本格式的数据容器。它还用于概念、比较、拆分、连接、替换、修剪、长度、实习、等于、比较、子字符串操作。使用快速排序分区算法的数组中的 K 个最大(或最小)元素

这是一个数组 R[],其中包含 N 个不同的整数。任务是找到那个特定元素,该元素严格大于其前面的所有元素,并且严格大于其右侧的至少 K 个元素。该问题指出,一个由 N 个不同元素和整数 K 组成的数组 arr[ ](数组 R);我们必须找出比其左侧所有元素都大的元素个数,并且其右侧至少有 K 个元素。

Input: R[] = {16,07,10,22,2001,1997}, K = 3Output: 16Therefore, the count is 2.

有两种方法可以找出大于左侧所有元素且右侧至少 K 个元素的数组元素。

朴素方法 – 这是遍历特定数组的最简单方法。在这个方法中,我们必须向左侧遍历所有元素来检查它是否较小。否则,向右遍历,检查最小的 K 个元素是否较小。对于这种方法,时间复杂度为 O(N2),辅助空间为 O(1)。

立即学习“C++免费学习笔记(深入)”;

高效方法 – 这是一个可以通过自平衡 BST 完成的优化过程。通过AVL Tree从右向左一一遍历数组。 AVL Tree 生成一个数组 countSmaller[]。这里时间复杂度是O(NlogN),辅助空间是O(N)。对于满足满足条件的每个元素,增加计数。

让我们找出数组元素的数量大于其左侧所有元素且右侧至少有 K 个元素。

计算大于所有元素的数组元素的算法:-

在此算法中,我们将按照一步一步的过程来计算数组元素的数量。通过这个,我们将构建一些 C++ 代码来找到所有元素中最大的元素。

第 1 步 – 开始。

第 2 步 – 从右向左遍历数组。

第 3 步 – 将所有元素插入 AVL 树中。

第 4 步 – 通过使用 AVL 树生成数组 countSmaller[]。

第 5 步 – 它包含每个数组元素右侧较小元素的计数。

第 6 步 – 遍历数组并查找每个元素。

第 7 步 – 检查是否是迄今为止获得的最大值,并且 countSmaller[i] 是否大于或等于 K。

第 8 步 – 如果满足条件,则增加计数。

第 9 步 – 打印 count 的最终值作为答案。

第 10 步 – 终止。

语法

for (i = k; i < array.length; i++){minIndex = 0;for (int j = 0; j < k; j++){   if(array[j] < array[minIndex]){      minIndex = j;      array[minIndex] = array[j];   }}if (array[minIndex] < array[i]){   int temp = array[minIndex];   array[minIndex] = array[i];   array[i] = temp;}

这里是一个整数数组num,整数为K。它将返回数组中的第K个元素。我们必须以 O(n) 的时间复杂度来解决它。

方法

方法 1 – 使用排序查找 K 个最大(或最小)元素。

方法 2 – 查找数组中 K 最大(或最小)元素的有效方法。

使用排序查找 K 最大(或最小)元素

通过排序的方法我们可以得到这个问题的结果。以下是步骤 –

元素降序排序。

打印该排序数组中的前 K 个数字。

示例 1

#include using namespace std;void kLargest(int arr[], int a, int b){   sort(arr, arr + a, greater());   for (int i = 0; i < b; i++)   cout << arr[i] << " ";}int main(){   int arr[] = { 10, 16, 07, 2001, 1997, 2022, 50 };   int n = sizeof(arr) / sizeof(arr[0]);   int k = 3;   kLargest(arr, n, k);}

输出

2022 2001 1997 

查找数组中 K 个最大(或最小)元素的有效方法

在此方法中,我们将按照以下步骤找出结果 –

开始。

从右向左遍历数组。

插入 AVL 树中的所有元素。

生成数组 countSmaller[]。

每个数组元素右侧较小元素的计数。

如果是最大值,则countSmaller[i]大于等于K。

然后增加计数。

打印该值。

结束。

示例 2

#include using namespace std;struct node {   int key;   struct node* left;   struct node* right;   int height;   int size;};int max(int a, int b);int height(struct node* N){   if (N == NULL)   return 0;   return N->height;}int size(struct node* N){   if (N == NULL)   return 0;   return N->size;}int max(int a, int b){   return (a > b) ? a : b;}struct node* newNode(int key){   struct node* node   = (struct node*)   malloc(sizeof(struct node));   node->key = key;   node->left = NULL;   node->right = NULL;   node->height = 1;   node->size = 1;   return (node);}struct node* rightRotate(struct node* y){   struct node* x = y->left;   struct node* T2 = x->right;   x->right = y;   y->left = T2;   y->height = max(height(y->left),   height(y->right))   + 1;   x->height = max(height(x->left),   height(x->right))   + 1;   y->size = size(y->left)   + size(y->right) + 1;   x->size = size(x->left)   + size(x->right) + 1;   return x;}struct node* leftRotate(struct node* x){   struct node* y = x->right;   struct node* T2 = y->left;   y->left = x;   x->right = T2;   x->height = max(height(x->left),   height(x->right))   + 1;   y->height = max(height(y->left),   height(y->right))   + 1;   x->size = size(x->left)   + size(x->right) + 1;   y->size = size(y->left)   + size(y->right) + 1;   return y;}int getBalance(struct node* N){   if (N == NULL)   return 0;   return height(N->left)   - height(N->right);}struct node* insert(struct node* node, int key,int* count){   if (node == NULL)      return (newNode(key));   if (key key)      node->left = insert(node->left, key, count);   else {      node->right = insert(node->right, key, count);      *count = *count + size(node->left) + 1;   }   node->height = max(height(node->left),   height(node->right))   + 1;   node->size = size(node->left)   + size(node->right) + 1;   int balance = getBalance(node);   if (balance > 1 && key left->key)   return rightRotate(node);   if (balance  node->right->key)   return leftRotate(node);   if (balance > 1 && key > node->left->key) {      node->left = leftRotate(node->left);      return rightRotate(node);   }   if (balance < -1 && key right->key) {      node->right = rightRotate(node->right);      return leftRotate(node);   }   return node;}void constructLowerArray(int arr[],int countSmaller[],int n){   int i, j;   struct node* root = NULL;   for (i = 0; i = 0; i--) {      root = insert(root, arr[i], &countSmaller[i]);   }}int countElements(int A[], int n, int K){   int count = 0;   int* countSmaller = (int*)malloc(sizeof(int) * n);   constructLowerArray(A, countSmaller, n);   int maxi = INT_MIN;   for (int i = 0; i  maxi && countSmaller[i] >= K) {         count++;         maxi = A[i];      }   }   return count;}int main(){   int A[] = { 16, 10, 2022, 1997, 7, 2001, 0 };   int n = sizeof(A) / sizeof(int);   int K = 3;   cout << countElements(A, n, K);   return 0;}

输出

2

结论

这样我们就知道如何编写 C++ 代码来计算数组元素的数量大于其左侧所有元素且右侧至少有 K 个元素。

以上就是C++程序,用于计算数组元素大于其左侧所有元素且至少有K个元素在其右侧的数量的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:31:11
下一篇 2025年12月15日 17:56:29

相关推荐

  • 使用归并排序算法编写的C/C++程序来计算数组中的逆序对数?

    对给定数组进行排序时发生的反转计数称为反转计数。逆问题是一个经典问题,可以使用归并排序算法来解决。在此问题 v 中,我们将计算其左侧大于它的所有元素,并将计数添加到输出。这个逻辑是在合并排序的合并函数中完成的。 为了更好地理解这个主题,让我们举一个例子。让我们考虑合并过程中涉及的两个子数组 &#82…

    2025年12月17日 好文分享
    000
  • 重新排列一个数组,如果在C++中,’arr’是’j’,则使’arr’变为’i’

    我们被给定一个正整数类型的数组,假设是arr[],它的大小可以任意给定,数组中的元素的值应该大于0但小于数组的大小。任务是重新排列一个数组,如果 arr[j] 是“j”,那么 arr[j] 就变成“i”并打印最终结果。 让我们看看这种情况的各种输入输出场景 – h2> 输入− in…

    2025年12月17日
    000
  • C++程序填充数组的特定元素

    数组是一种同质数据结构,用于在连续的内存位置中保存相似类型的数据,可以使用基地址和索引进行访问。有很多不同的应用程序中,我们使用数组来保存适用于合适用途的数据。向数组中插入元素是一种繁琐的过程之一。我们可以通过循环从用户那里获取输入来插入它们,或者从文件中插入它们,或者还有其他一些插入它们的方法。初…

    2025年12月17日
    000
  • 计算通过交换给定数组中字符串对的第一个字符而得到的新字符串对的数量

    在这个问题中,我们需要选择一对字符串并交换它们的第一个字符。之后,我们需要计算新对的总数。我们可以通过交换每对的第一个字符并检查它是否存在于数组中来解决这个问题。 解决这个问题的高效方法是使用哈希映射数据结构。 问题陈述 – 我们有一个包含N个字符串的数组。我们可以从所有数组元素中选择任…

    2025年12月17日
    000
  • C++程序以查找数组中第二大的元素

    数组的目的是将相似类型的数据存储在一系列可以使用基地址和索引访问的内存位置中。我们在许多不同的应用程序中使用数组来保存用于各种目的的数据。查找最小和最大元素是数组的一个相当常见的示例,在包括排序等在内的多个应用程序中都需要数组。在本文中,我们将了解如何在 C++ 中从数组中查找第二大元素。 通过示例…

    2025年12月17日
    000
  • C++程序将数组转换为集合(哈希集合)

    数组是 C++ 中可用的数据结构,用于保存相同类型元素的顺序集合。数组的大小是固定的,但可以根据需要扩展或缩小。将数组视为相同类型变量的集合很重要,即使它用于存储数据集合。集合(或者在本例中为无序集合)是一种以任意顺序存储特定数据类型的元素的容器。哈希表用于实现 unordered_set,其中键被…

    2025年12月17日
    000
  • 使用C++编写,找到数组中的素数对数量

    在本文中,我们将解释有关使用 C++ 查找数组中素数对数量的所有内容。我们有一个整数数组 arr[],我们需要找到其中存在的所有可能的素数对。这是问题的示例 – Input : arr[ ] = { 1, 2, 3, 5, 7, 9 }Output : 6From the given a…

    2025年12月17日
    000
  • 在给定的数组中找到最后一个回文字符串

    在这个问题中,我们需要找到数组中的最后一个回文字符串。如果任何字符串在读取时相同,无论是从头开始读取还是从末尾开始读取,都可以说该字符串是回文。我们可以比较起始字符和结束字符来检查特定字符串是否是回文。查找回文字符串的另一种方法是将字符串反转并与原始字符串进行比较。 问题陈述 – 我们给…

    2025年12月17日
    000
  • C++程序用于计算使数字n变为1所需的最小操作次数

    假设我们有一个数字n。我们任意执行这些操作之一 – 当 n 可被 2 整除时,将 n 替换为 n/2 当 n 可被 3 整除时,将 n 替换为 2n/3 当 n 可被 5 整除时,将 n 替换为 4n/5 立即学习“C++免费学习笔记(深入)”; li> 我们必须计算出数字 1 所…

    2025年12月17日
    000
  • 按照给定的查询重新排列和更新数组元素

    在这个问题中,我们将对数组元素执行给定的查询。查询包含数组元素的循环左旋转、右旋转和更新。 解决问题的逻辑部分是数组旋转。向左旋转数组的简单方法是将每个元素替换为下一个元素,将最后一个元素替换为第一个元素。 我们可以使用deque数据结构来高效地旋转数组。 问题陈述 – 我们给出了一个包…

    2025年12月17日
    000
  • C++程序:在数组中找到最大的可整除子集

    本教程将讨论一个问题,其中给定一个不同的正整数数组。我们需要找到最大的子集,使得每对较大的元素除以较小的元素,例如 – Input: nums[ ] = { 1, 4, 2, 6, 7}Output: 1 2 4Explanation:All Divisible subsets are:…

    2025年12月17日
    000
  • C++程序:对数组元素进行升序排序

    为了有效地解决一些问题,将数据项排列在正确的位置非常重要顺序。最流行的排列问题之一是元素排序问题。这本文将演示如何在 C++ 中按升序排列数组成员(根据值不断上升)。 要按特定顺序排列数字或非数字元素,有多种方法排序算法可用于该领域。只需两种简单的排序技术即可将在本文中介绍。选择排序和冒泡排序。让我…

    2025年12月17日
    000
  • C++程序:计算使所有礼物数量相等的操作次数

    假设我们有两个数组 A 和 B,每个数组的大小为 n。有n份礼物,我们想把它们送给一些孩子。第 i 份礼物有 A[i] 颗糖果和 B[i] 个橙子。在一次移动过程中,我们可以选择一些礼物并执行以下操作之一 – 从该礼物中取出一颗糖果(如果有); p> 从这份礼物中取出一颗橙子(如果…

    2025年12月17日
    000
  • 两两乘积之和

    集合X = {a, b, c}的成对乘积可以定义为所有可能的集合对乘积的和。集合的成对为Y = {a * a, a * b, a *c, b * b, b * c, c * c},其中乘积是可交换的。因此,集合X的成对乘积是集合Y的元素之和,即aa + ab + ac + bb + bc + cc。…

    2025年12月17日
    000
  • C程序用于计算等比数列的第N项

    Given ‘a’ the First term, ‘r’ the common ratio and ‘n’ for the number of terms in a series. The task is to find the nth term of the series. So, before…

    2025年12月17日
    000
  • 如何使用指针在C语言中计算数组元素的总和?

    指针是一个存储其他变量地址的变量。 考虑以下语句 – int qty = 179; 声明指针 h2> 声明指针的语法如下 – int *p; 这里,’p’是一个指针变量,它保存其他变量的地址。 立即学习“C语言免费学习笔记(深入)”; 指针的初始…

    2025年12月17日
    000
  • 找到C++中修改后数组的最小值的最大可能值

    在这个问题中,我们给定一个大小为 n 的数组 arr[] 和一个数字 S。我们的任务是找到修改后的数组的最小值的最大可能值。 p> 这里是修改数组的规则, 修改前后数组元素之和应为S。 修改后的数组中不允许有负值。 如果修改后的数组,需要数组的最小值最大化。 立即学习“C++免费学习笔记(深入…

    2025年12月17日
    000
  • 如何在C语言中将整个数组作为参数传递给函数?

    数组 数组是一组具有相同名称的相关项。以下是将数组作为参数传递给函数的两种方式: 将整个数组作为参数传递给函数将单个元素作为参数传递给函数 将整个数组作为参数传递给函数 要将整个数组作为参数传递,只需在函数调用中发送数组名称。 要接收一个数组,必须在函数头中声明。 示例1 #includemain …

    2025年12月17日
    000
  • 根据给定条件,从数组中构建一个长度为K的二进制字符串

    在本教程中,我们需要构造一个长度为 K 的二进制字符串,如果使用数组元素可以实现等于 I 的子集和,则它的第 i 个索引处应包含“1”。我们将学习两种解决问题的方法。在第一种方法中,我们将使用动态规划方法来检查子集和等于索引“I”是否可能。在第二种方法中,我们将使用位集通过数组元素查找所有可能的和。…

    2025年12月17日
    000
  • 如何在C语言中计算浮点数中的位数?

    在此问题中,给出了一个浮点值。我们必须找到它的二进制表示中的设置位的数量。 例如,如果浮点数是0.15625,则有六个设置位。典型的 C 编译器使用单精度浮点表示。所以它看起来像这样。 要转换为位值,我们必须将数字放入一个指针变量中,然后将指针强制转换为 char* 类型数据。然后对每个字节进行一一…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信