【发布时间】:2017-08-12 01:38:34
【问题描述】:
示例输入:
1 2 3 4 5(数组元素)
m = 1(奇数)
样本输出:
8。
子数组是 [[1], [1,2], [2,3], [2,3,4], [3], [3,4], [4,5], [5]]
这是我的实现。在最坏的情况下,需要 O(n+n^2)。有什么方法可以优化这段代码吗?
int main() {
int n, *a, count1=0, m, *dp;
cin>>n;
a = new int[n];
dp =new int[n];
for(int i=0; i<n; i++) {
cin >> a[i];
}
cin >> m;
for(int i=0; i<n; i++){
if(a[i]%2==1) {
count1++;
}
dp[i] =count1;
}
int prev;
long count=0;
for(int i=0; i<n; i++) {
prev= i==0 ? 0:dp[i-1];
for(int j=i; j<n; j++) {
if((dp[j] - prev) == m){
count++;
}
if(dp[j] - prev > m){
break;
}
}
}
cout<<count;
}
【问题讨论】:
-
作为一个兴趣点,大 O 表示法往往只使用最重要的术语,因此您的算法将是 O(n^2)。