使用C++查找和在给定范围内的子数组数量
在本文中,我们将使用C++程序解决求和在给定范围内的子数组数量的问题。我们有一个正整数数组arr[],以及一个范围{L, R},我们需要计算总共有多少个子数组的和在这个给定的L到R范围内。这是一个简单的例子:
Input : arr[] = {1, 4, 6}, L = 3, R = 8
Output : 3
The subarrays are {1, 4}, {4}, {6}.
Input : arr[] = {2, 3, 5, 8}, L = 4, R = 13
Output : 6
The subarrays are {2, 3}, {2, 3, 5}, {3, 5},
{5}, {5, 8}, {8}.解决方法
我们将解释两种使用C++解决这个问题的方法:
暴力法
最基本的暴力法是计算每个子数组的和,然后判断该和是否在给定范围内。(但是这种方法会花费大量时间,因为它的时间复杂度为O(n*n),其中n是数组的大小)。
高效方法
为了节省时间,我们使用另一种称为高效方法的方法。高效方法使用滑动窗口技术,使用这种技术,我们可以更快更高效地计算结果,时间复杂度为O(n)。
示例
#include <bits/stdc++.h>
using namespace std;
int subCount(int *arr, int n, int x){
int start = 0, end = 0, sum = 0, count = 0;
while (end < n){ // we will be moving right border in this loop
sum = sum + arr[end];
while(start <= end && sum >= x){ // this loop will move our left border
sum = sum - arr[start]; // we will decrement sum while moving left border.
// For excluding the previous elements.
start++; // and move the left border.
}
count = count + ((end - start) + 1); // counting the subarrays.
end++;
}
return count;
}
int main(){
int arr[] = { 1, 4, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
int L = 3;
int R = 8;
int answer;
answer = subCount(arr, n, R) - subCount(arr, n, (L - 1)); // Final Answer.
cout << answer << "\n";
return 0;
}输出
3
以上代码的解释
在这种方法中,我们计算和小于给定范围上限的子数组数量,然后我们使用我们的subcount函数减去和小于给定范围下限的子数组数量。
Subcount函数
此函数使用滑动窗口技术来查找计数小于x的子数组的计数。
首先,我们将'end'和'start'都设置为0。当我们遍历数组时,我们保持从start到end的元素的和。之后,如果我们的start等于我们的end并且sum大于或等于x,我们开始移动我们的start并随着我们从sum中移除元素而减少我们的sum。
直到我们的sum小于x或我们的start大于end。现在我们用子数组计数增加计数,然后将右边界加1。现在,在我们的外循环结束之后,我们返回子数组的总计数。
结论
在本文中,我们使用滑动窗口技术,以O(n)的时间复杂度解决了查找和在给定范围内的子数组数量的问题。我们还学习了C++程序以及解决这个问题的完整方法(普通方法和高效方法),我们可以轻松地解决这个问题。我们可以使用其他语言(例如C、Java、Python等)编写相同的程序。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP