样品输入: 1 2 3 4 5
(数组元素) m = 1
(奇数) 示例输出: 8
。 子阵列是[[1]
,[1,2]
,[2,3]
,[2,3,4]
,[3]
,[3,4]
,[4,5]
,[5]
]给定一个数组找到m个奇数的子数组的数量?
这是我的implementation.In最坏的情况下,这将需要O(N + N^2).Are有任何优化此代码的方法?
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)。 – paxdiablo