写了一道od题目,不知道代码合理不,麻烦大佬们帮忙看看

【数组连续和】

给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。

输入描述

第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000)

第二行有N个正整数(每个正整数小于等于100)。

输出描述

输出一个整数,表示所求的个数。

注意:此题对效率有要求,暴力解法通过率不高,请考虑高效的实现方式。

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3 7

3 4 7

输出

4

样例解释

第一行的3表示第二行数组输入3个数,第一行的7是比较数,用于判断连续数组是否大于该数;

组合为 3 + 4; 3 + 4 + 7; 4 + 7; 7; 都大于等于指定的7;所以共四组。

示例2 输入输出示例仅供调试,后台判题数据一般不包含示例

10 10000

1 2 3 4 5 6 7 8 9 10

样例解释

所有元素的和小于10000,所以返回0。
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public: 
	int ansNum(vector<int>& nums,int target) {
		int n = nums.size();
		int l = 0, r = 0;
		int ans = 0, tmp = 0;
		while (r < n) {
			tmp += nums[r];
			if (tmp >= target) {
				ans+= n-r;
				while (l <= r && tmp >= target) {
					tmp -= nums[l];
					l++;
					if (tmp >= target) {
						ans+= n-r;
					}
				}
			}
			r++;
		}
		return ans;
	}
};
int main() {
	int N, x;
	cin >> N >> x;
	vector<int>nums(N);
	for (int i = 0; i < N; i++) {
		cin >> nums[i];
	}
	Solution solve;
	cout << solve.ansNum(nums, x) << endl;
	return 0;
}


#华为od#
全部评论
滑动窗口可以,不过感觉这题前缀和+二分更好处理一点🤔
点赞
送花
回复
分享
发布于 2022-06-14 13:35

相关推荐

2 4 评论
分享
牛客网
牛客企业服务