给我们一个包含整数和变量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(int arr [],int size,int x)接收数组和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