c – 给定一个数组找到m个奇数的子数组?
发布时间:2020-12-16 03:45:38 所属栏目:百科 来源:网络整理
导读:样本输入: 1 2 3 4 5(数组元素) m = 1(奇数) 样本输出: 8. 子阵列是[[1],[1,2],[2,3],3,4],[3],[3,[4,5],[5]] 这是我的实现.在最坏的情况下,它需要O(n n ^ 2).是否有任何方法来优化此代码? int main() { int n,*a,count1=0,m,*dp; cinn; a = new int[n];
样本输入:
1 2 3 4 5(数组元素) m = 1(奇数) 样本输出: 8. 子阵列是[[1],[1,2],[2,3],3,4],[3],[3,[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(n)中解决.首先生成奇数之间的间隙长度的数组,将两端计为隐式奇数.在这种情况下,该数组是g = [0,1,0].然后我们求和(g [i] 1)*(g [i m] 1)因为它表示有多少子阵列在第i个奇数开始或恰好在第i个奇数之前,并且在第i个奇数之后或之后结束.
在这种情况下,我们得到1 * 2 2 * 2 2 * 1 = 8. 替代解释 我掩饰了一个重要的细节.这是我假设包含奇数,所以0<米如果m = 0,则计算完全改变.然后答案是1和(g(i)*(g(i)-1)/ 2). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |