【发布时间】:2020-03-23 07:21:23
【问题描述】:
我得到一个包含二进制值的向量。我需要在整个向量中找到最长的连续连续条纹。这是我无法完全解决的逻辑类型。我可以解决大多数情况,但不是全部,这意味着我的算法有问题。我们甚至可以将问题的方式更改为任何数组中的任何类型的连续值。我试过一个计算正面和反面条纹的问题,但仍然无法解决 10/ 10 个案例。
我认为当条纹从向量的后半部分开始而不是从第一个元素开始的最大条纹开始时,该算法给出了错误的答案。
这是我针对基于二进制值请求条纹的问题的算法。 此外,我了解 2 个迭代器值并不是最有效的,但我想用我的术语简化我的答案。
示例输入: [1,1,0]
样本输出: 2
示例输入 2:[1,1,0,0,0,1,1,1]
样本输出 2:3
void getMaxStreaks(vector<int> arr) {
int largest_streak{0};
int streak_counter{0};
for(int i = 0; i <= arr.size() - 1; i++){
if(arr[i] == 1){
streak_counter = 1;
}
for(int j = i + 1; j <= arr.size() -1; j++){
if(arr[i] == 1 && arr[j] == 1){
streak_counter++;
}
else if(arr[i] == 1 && arr[j] == 0){
if(streak_counter > largest_streak){
largest_streak = streak_counter;
streak_counter = 0;
}
}
}
if(streak_counter > largest_streak){
largest_streak = streak_counter;
streak_counter = 0;
}
}
【问题讨论】:
-
“我得到了一个包含二进制值的向量”:这很不清楚。你的意思是你有一个
vector<int>只包含值 0 和 1 ? -
还有edit您的问题并显示minimal reproducible example,包括输入示例和预期输出与实际输出
-
正如你所说的逻辑是完全错误的。连续是连续值。您的代码只是测试单个值。在某个地方,您需要以某种方式针对其前身测试向量值。
-
我添加了 2 个不同的案例并正确输出。很抱歉不清楚。抱歉,我的意思是在值向量内进行测试。我的大脑可能会因为被这个概念卡住而被烧毁,所以对于不够清晰表示歉意。
-
这是一种方法。您的代码需要具有布尔变量,如果您当前处于连续状态,则该变量为 true,否则为 false。然后,当您读取 1 时,如果您没有连续,那么您知道您正在开始一个,如果您处于连续状态,您可以将该连续的长度增加一。然后,当您读取 0 并且如果您处于连胜状态,那么您知道您刚刚完成了一个,所以现在您有了刚刚完成的连胜的长度,您可以将其与迄今为止发现的最长连胜进行比较。
标签: c++ algorithm iterator logic