这段代码是用C++编写的,通过输入数组a和整数k、q,计算了符合条件的连续子数组的个数。该算法的思想是先找出数组a中大于q的位置,然后根据这些位置计算符合条件的子数组数量。
下面是对这段代码的注释解释:#include <bits/stdc++.h> // 引入标准库using namespace std;int main() { // 主函数 int t; // 定义变量t,表示测试用例的数量 cin >> t; // 输入测试用例的数量 while (t--) { // 循环处理每个测试用例 int n, k, q; // 定义变量n、k、q,表示数组长度、子数组最小长度、最大元素值 cin >> n >> k >> q; // 输入数组长度、子数组最小长度、最大元素值 vector<int> a(n); // 声明一个大小为n的整数数组a for (int j = 0; j < n; j++) { // 循环读入数组a的元素 cin >> a[j]; // 输入数组a的元素 } vector<int> p; // 声明一个整数向量p,用于记录大于q的位置 p.push_back(-1); // 将-1添加到p中,作为起始位置 for (int j = 0; j < n; j++) { // 遍历数组a,找出大于q的位置 if (a[j] > q) { // 如果数组a中元素大于q p.push_back(j); // 将该位置j添加到p中 } } p.push_back(n); // 将数组长度n添加到p中,作为结束位置 int m = p.size(); // 计算p的长度 long long ans = 0; // 定义ans,用于记录符合条件的子数组数量 for (int j = 0; j < m - 1; j++) { // 遍历p数组 int d = p[j + 1] - p[j]; // 计算相邻两个大于q的位置之间的距离 if (d >= k) { // 如果距离大于等于k ans += (long long)(d - k + 1) * (d - k) / 2; // 更新ans,累加符合条件的子数组数量 } } cout << ans << endl; // 输出符合条件的子数组数量 }}
如果你想尝试其他写法,可以考虑使用滑动窗口或者双指针的方法来解决这个问题。我之前给出的基于滑动窗口的示例代码可能会帮助你更好地理解不同的解题思路。 |