计算在C ++中元素小于或等于X的子数组
给我们一个包含整数和变量X的数组arr[]。目标是对arr[]的所有子数组进行计数,以使每个子数组仅包含小于或等于X的元素。例如,如果array为[1,2,3]和X=2,那么子数组将是[1],[2]和[1,2]
让我们通过示例来理解。
输入−arr[]={4,3,2,1,6};X=3
输出-元素小于或等于X的子数组的计数为-6
说明-Subaarays将是-
[3], [2], [1], [3,2], [2,1], [3,2,1]
输入−arr[]={3,6,2,7,1,8,5};X=5
输出-元素小于或等于X的子数组的计数为-4
说明-Subaarays将是-
[3], [2], [1], [5]
以下程序中使用的方法如下
我们正在创建一个与原始数组arr[]大小相同的二进制数组temp_arr[]。如果对应的arr[i]小于或等于X,则此二进制数组将为1,否则为0。现在遍历temp_arr[]并检查连续的1(在arr[]中小于X的元素)。将每个此类子数组的长度存储在temp中。对于长度为temp的数组。子数组总数为temp*(temp+1)/2。将其添加到总数中,并继续到temp_arr[]的末尾。
取数组arr[]和变量X。
函数sub_X(intarr[],intsize,intx)接收数组和x并返回仅包含小于或等于x的元素的子数组的计数。
将临时变量temp和此类子数组的最终总数作为count。
取一个长度与arr[]相同的二进制数组temp_arr[]。
我们将使用从i=0到i<size的for循环遍历数组arr[]。
对于每个元素arr[i]<=x,设置temp_arr[i]=1否则为0。
使用for循环遍历temp_arr[]。
如果任何元素temp_arr[i]==1。则使用子循环从当前索引i遍历,直到temp_arr[temp_2](temp_2=i+1;temp_2<size)为1。如果为0,则中断子循环。
全为1的子数组的计数为temp=temp_2-i。
该子数组全为1,表示arr[i]中的所有元素均<=x。子数组总数将为temp_3=temp*(temp+1)/2。
在两次遍历结束时,计数将包含arr内所有小于或等于x的子数组的计数总数。
示例
#include <iostream> using namespace std; int sub_X(int arr[], int size, int x){ int count = 0, temp = 0; int temp_arr[size]; for (int i = 0; i < size; i++){ if (arr[i] <= x){ temp_arr[i] = 1; } else{ temp_arr[i] = 0; } } for (int i = 0; i < size; i++){ if (temp_arr[i] == 1){ int temp_2; for(temp_2 = i + 1; temp_2 < size; temp_2++){ if(temp_arr[temp_2] != 1){ break; } } temp = temp_2 - i; int temp_3 = (temp) * (temp + 1)/2; count = count + temp_3; i = temp_2; } } return count; } int main(){ int arr[] = { 2, 6, 1, 10, 5, 3 }; int x = 4; int size = sizeof(arr) / sizeof(arr[0]); cout<<"Count of sub-arrays which have elements less than or equal to X are: "<<sub_X(arr, size, x); return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of sub-arrays which have elements less than or equal to X are: 3