统计给定值在C++中所在的区间数
给定一个包含区间的二维数组 arr[][] 和一个数字“value”。目标是找到 arr 中存在多少个区间,value 位于这些区间之间。例如,区间为 [[1,5], [3,7]],value=4,则它位于这两个区间内,计数为 2。
例如
输入
arr[4][2] = { { 1, 20 }, { 12, 25 }, { 32, 40 }, { 15, 18 } } value=16
输出
Count of number of intervals in which a given value lies are: 3
解释
The value 16 lies between 1−20, 12−25 and 15−18
输入
arr[4][2] = {{ 1, 20 }, { 20,30 }, { 30, 40 }, { 40, 50 }} value=60
输出
Count of number of intervals in which a given value lies are: 0
解释
The value 60 is larger than all maximum ranges of intervals present in arr[][].
下面程序中使用的方案如下 −
在这个方案中,我们将为 arr 中存在的范围的所有数字生成一个频率数组 arr_2[]。因此,对于每个范围的 arr[i][0] 和 arr[i][1],频率将在 arr_2[ arr[i][0 or 1] ] 中递增。最后,我们将使用 arr_2[i]=arr_2[i]+arr_2[i−1] 更新频率数组,因为小于 i-1 的数字也小于 i,因此频率将被累加。通过这种方式,我们将获得 arr_2[value] 作为 value 所在的所有范围。
取一个包含范围的整数数组 arr[][]。
取一个整数 value 作为输入。
函数 intervals_values(int arr[][2], int size, int value) 获取 arr 和 value 并返回给定值所在的区间数。
取频率数组 arr_2[]。
取 low 和 highest 为 INT_MAX 和 INT_MIN。
使用 for 循环从 i=0 到 i<size 遍历 arr[][]。
取 temp 为范围的左端点,并在 arr_2[temp] 中递增其频率。
取 temp_2 为范围的右端点,并在 arr_2[temp_2+1] 中递增其频率。
如果 temp<low,则设置 low=temp;如果 temp_2>highest,则设置 highest 为 temp_2。
遍历频率数组并更新它 arr_2[i]=arr_2[i]+arr_2[i+1]。
最后返回 arr_2[value] 作为结果。
示例
#include<bits/stdc++.h> using namespace std; #define max 1000 int intervals_values(int arr[][2], int size, int value){ int arr_2[max]; int low = INT_MAX; int highest = INT_MIN; for(int i = 0; i < size; i++){ int temp = arr[i][0]; arr_2[temp] = arr_2[temp] + 1; int temp_2 = arr[i][1]; arr_2[temp_2 + 1] = arr_2[temp_2 + 1] − 1; if(temp < low){ low = temp; } if(temp_2 > highest){ highest = temp_2; } } for (int i = low; i <= highest; i++){ arr_2[i] = arr_2[i] + arr_2[i − 1]; } return arr_2[value]; } int main(){ int arr[4][2] = { { 3, 20 }, { 2, 13 }, { 25, 30 }, { 15, 40 } }; int size = sizeof(arr) / sizeof(arr[0]); int value = 28; cout<<"Count the number of intervals in which a given value lies are: "<<intervals_values(arr, size, value); return 0; }
输出
如果我们运行上面的代码,它将生成以下输出:
Count the number of intervals in which a given value lies are: 18830628