我正在寻找一个给出如下列表的算法:
[1, 1, 2, 1, 1, 5, 1, 1, 1, 1, 2, 1]
可以查找并返回给定值的所有子序列。例如,如果给定值1,则函数将返回[[1, 1], [1, 1], [1, 1, 1, 1], [1]]
。
我认为这类似于诸如总结数组的所有子序列或查找给定字符串的所有子序列之类的问题,但算法从来都不是我的强项。答案可以是伪代码或语言无关。如果你不介意,你能解释解决方案的复杂性吗?
如果有帮助,我可以解释一下我需要什么。如果你想要评论。
答案 0 :(得分:1)
我们可以通过扫描阵列两次来实现O(n)时间复杂度。伪代码:
//use an array list so we can access element at an index in O(1) time
outputArrays = new ArrayList<int[]> //list of arrays
//loop to declare arrays of outputs - this scans each element once
int currLen = 0;
for (item in inputArray) {
if (item = itemToLookFor) {
currLen++;
}else if (currLen > 0) {
currLen = 0;
outputArrays.add(new int[currLen]);
}
}
//loop to actually populate the output - this scans each element once
currLen = 0;
currIndex = 0;
for (item in inputArray) {
if (item = itemToLookFor) {
outputArrays.getElement(currIndex)[currLen] = item;
currLen++;
}else if (currLen > 0) {
currLen = 0;
currIndex++;
}
}
如果有任何我可以澄清的话,请告诉我。
答案 1 :(得分:0)
让a
为初始数组,res
- 生成的序列数组curSeq
- 当前序列given_value
- 给定值。
res = []
curSeq = []
for i = 1..length(a)
if a[i] != given_value
if curSeq has at least one item
append curSeq to res
end if
curSeq = []
else
append given_value to curSeq
end if
end for
if curSeq has at least one item
append curSeq to res
end if
如您所见,时间复杂度为 O(n),其中 n 是初始数组的长度。
答案 2 :(得分:0)
这是<div [style.top.px]="someProp"></div>
someMethod() {
this.someProp = 10;
}
解决方案。
这里O(n)
是序列的输入数组,arr
是子序列的数组。你可以为你的答案保存序列另一个数组。
sequence