【问题标题】:count a continous subarray start with that index计算从该索引开始的连续子数组
【发布时间】:2015-11-05 00:29:59
【问题描述】:
我有一个数组A 并且想要一个与A 大小相同的数组B,其中B[i] 表示以A[i] 开头的连续子数组的长度,其中所有元素都小于或等于A[i]
示例
A={1,3,4,2,4,5,1,6}
输出
B={1,1,3,1,1,2,1,1}
说明:
对于A[2]=4,有一个子数组,元素{4,2,4},对于A[5]=5,有一个子数组{5,1},对于A[7]=6,有一个子数组{6}
【问题讨论】:
-
-
好像你复制粘贴了你的家庭作业并想要一个你可以复制粘贴并作为家庭作业提交的答案。这类问题在这里不太受欢迎。尝试添加您尝试过的内容以及失败的原因。另外,我已将此问题作为this 答案中的子问题解决。
标签:
arrays
algorithm
maxlength
sub-array
【解决方案1】:
You can apply below algorithm to get the answer for your problem:-
Array B =[]; //initialize blank array
for (int i=0; i< A.length(); i++)
{
j=i;
length=1;
while(i< A.length()-1)
{
j++;
if(A[j]<=A[i])
length++;
else
break;
}
B[i]= length;
}
Print B // This will give you the similar array as of Array "A".
【解决方案2】:
复杂度:O(n)
#include <iostream>
#include <fstream>
using namespace std;
#define max 10000
int main(int argc, const char * argv[]) {
ifstream input("/Users/appleuser/Documents/Developer/xcode projects/SubArrayCount/SubArrayCount/input.in");
int n, arr[max], after[max]={0};
input >> n;
for (int i=0; i<n; i++)
input >> arr[i];
for (int i=n-1;i>=0;i--)
for (int j=i+1;j<n&&arr[j]<=arr[i];j+=after[j]+1)
{
if (arr[j]==arr[i])
{
after[i]++;
break;
}
after[i]+=after[j]+1;
}
for (int i=0; i<n; i++)
cout << after [i] << " ";
cout << endl;
return 0;
}