C++ 查找最大为k的最长二进制子序列的长度
正如在标题中所看到的,我需要找到最长的二进制子序列的长度,其中最多有C++ 查找最大为k的最长二进制子序列的长度,c++,algorithm,C++,Algorithm,正如在标题中所看到的,我需要找到最长的二进制子序列的长度,其中最多有k个。例如: k=3,二进制顺序=11100001101010000011,答案是:10(因为最长的子序列是11100001101011010000011) k=1,二进制顺序=00101001001,答案是:5(因为最长的子序列是00101001001) 我做了,但时间是二次的(我猜) #包括 #包括 使用名称空间std; 模板 无效波普_前(V&V) { v、 擦除(v.begin()); } int main(){ int
k
个。例如:
k=3
,二进制顺序=11100001101010000011
,答案是:10(因为最长的子序列是11100001101011010000011)
k=1
,二进制顺序=00101001001
,答案是:5(因为最长的子序列是00101001001)
我做了,但时间是二次的(我猜)
#包括
#包括
使用名称空间std;
模板
无效波普_前(V&V)
{
v、 擦除(v.begin());
}
int main(){
int k,maxLength=0,lengthOfSequence;
布尔一号;
字符串bin_seq;
长度顺序=1;
矢量糜棱岩;
cin>>k;
cin>>bin_seq;
用于(字符数:bin_seq){
myList.push_back(0);
如果(num='1'){
对于(int i=0;ik){
pop_front(myList);
长度顺序--;
}
}
cout您可以使用此算法在O(n)中执行此操作:
- 制作两个索引,一个用于所需子序列的开始,一个用于所需子序列的结束
- 通过增加
end
索引继续扩展序列,直到到达k+1
-st1
- 在继续扩展序列超过
k+1
-st1
之前,请通过“拉入”起始点来缩小序列,跳过序列中最早的1
- 每次通过增加
end
扩展序列时,记录序列的最大长度
- 一旦到达序列的末尾,
max
将拥有最长的子序列,其中最多包含k
个
使用此算法,您可以在O(n)中执行此操作:
- 制作两个索引,一个用于所需子序列的开始,一个用于所需子序列的结束
- 通过增加
end
索引继续扩展序列,直到到达k+1
-st1
- 在继续扩展序列超过
k+1
-st1
之前,请通过“拉入”起始点来缩小序列,跳过序列中最早的1
- 每次通过增加
end
扩展序列时,记录序列的最大长度
- 一旦到达序列的末尾,
max
将拥有最长的子序列,其中最多包含k
个
假设输入为11010110000011
1101011010000011
fedcba9876543210 << Bit Positions
假设输入为11010110000011
1101011010000011
fedcba9876543210 << Bit Positions
这是O(n)问题。一圈。想做就做不要创建类似于myList
的内容。使用迭代器/索引。这是O(n)问题。一圈。想做就做不要创建类似于myList
的内容。使用迭代器/索引。除了k+1-st1
之外,我什么都懂。你是说k+1-startPosition==1
之类的吗?我只理解-st
和1
@PiotrWasilewicz之间的这个空格,在你的“111000011010101000011”
和k==3
的例子中,k+1
-st1
(第4位1
)的零基位置是7
。您将子序列扩展到“1110000”
,然后到达第4个1
,因此您必须拉入起始索引以到达“1100001”
,然后到达“10000110”
,依此类推。哦,我现在明白了。现在算法很简单。非常感谢。我什么都懂,除了k+1-st1
你的意思是k+1-startPosition==1
之类的吗?我只理解-st
和1
@PiotrWasilewicz之间的这个空格,在你的“111000011010101000011”
和k==3
的例子中,k+1
-st1
(第4位1
)的零基位置是7
。您将子序列扩展到“1110000”
,然后到达第4个1
,因此您必须拉入起始索引以到达“1100001”
,然后到达“10000110”
,依此类推。哦,我现在明白了。现在算法很简单。非常感谢。
For K = 3
Array: 0 1 7 9 a c e f
i,j: ^ ^
max = 9 - (0-1) - 1
-----------------------
0 1 7 9 a c e f
i++,j++: ^ ^
max = (arr[j+1] - arr[i-1]) - 1
= a - 0 - 1 = 9
-----------------------
0 1 7 9 a c e f
^ ^
max = (arr[j+1] - arr[i-1]) - 1
= c - 1 - 1 = 12- 1- 1 = 10 (as 10 > 9)
-----------------------
0 1 7 9 a c e f
^ ^
max = (e - 7) - 1 = 14 - 7 - 1 = 6. So max = 10
-----------------------
0 1 7 9 a c e f
^ ^
max = f-9 - 1 = 15-9-1 = 5 (<10).
-----------------------
0 1 7 9 a c e f
^ ^
max = (f+1) - a - 1 = 16-10-1 = 5 (<10).
So, max = 10;