求出包含多个连续k 0s以及随后多个连续k 1s的最长子序列的长度

ddon-90

给定一个0和1的数组,请找出最长子序列的长度,该子序列包含多个连续的k 0s,然后是多个连续的k 1s。

注意:子序列前可能有0,而子序列后可能有1,但不能同时发生,否则子序列最长。

寻找一个极好的复杂性的算法。

这是我到目前为止的位置。

int subsequence(int v[], int dim){
int i, k_0=0, k_1=0, count_0=0, count_1=0, prev=-1;
for (i = 0; i < dim; i++) {

    if (v[i] == 0 && prev == 1) {
        count_0 = 0;
        count_1 = 0;
        k_0 = k_1 = (k_0 < k_1) ? k_0 : k_1;
    }

    if (v[i] == 0) {
        count_0 += 1;
    }

    if (v[i] == 1) {
        count_1 += 1;
    }

    k_0 = (count_0 > k_0) ? count_0: k_0;
    k_1 = (count_1 > k_1) ? count_1: k_1;
    prev = v[i];
}
return (k_0 < k_1) ? k_0 : k_1;

}

Complexity O(n)

有解决这个问题的更好方法吗?

来自莫斯科的弗拉德

更好的方法是使用更清晰的算法实现正确地声明和定义函数。

第一个参数应具有限定符const,第二个参数应具有type size_t并且函数返回类型也应为size_t

在函数中,首先应该找到等于0的第一个元素,然后再处理数组的其余部分。

我将通过以下方式编写函数

#include <stdio.h>

size_t longest_subsequence( const int a[], size_t n )
{
    const int value1 = 0;
    const int value2 = 1;

    size_t longest = 0;

    size_t i = 0;
    while ( i < n && a[i] != value1 ) i++;

    while ( i < n )
    {

        size_t n1 = i;

        while ( i < n && a[i] == value1 ) i++;

        size_t n2 = i;

        while ( i < n && a[i] == value2 ) i++;

        n1 = n2 - n1;
        n2 = i - n2;

        n1 = n2 < n1 ? n2 : n1;

        if ( longest < 2 * n1 ) longest = 2 * n1;
    }

    return longest;
}

int main(void) 
{
    int a[] = { 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1 };
    const size_t N = sizeof( a ) / sizeof( *a );

    printf( "%zu\n", longest_subsequence( a, N ) );

    return 0;
}

程序输出为

6

实际上,数组的最长子序列是

{ 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1 };
                                ^^^^^^^^^^^^^^^^

或计算出的值可能看起来像

if ( longest < n1 ) longest = n1;

原则上,如何计算并不重要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

获得最长的连续序列1s

在numpy矩阵中找到最长和最短序列1s或0s的开始/停止位置和长度

如何找到最长子串的长度,使其连续重复

和的最长子数组的长度小于或等于k

使用k个查询在二进制字符串中找到最长为1的最长子字符串的长度

找出包含频率相同的字母的最长子序列

如何返回由Python列表中的连续数字形成的最长子序列?

子网是否总是连续的1s?

最长高原解:等值的最长连续序列的长度和位置

C如何计算长变量中最长的连续0序列的长度?

连续字母的最长序列

长度不超过k的连续子序列的最大和

计算数组中连续的(1s)数量

总和等于 s 的最长子数组

在整数数组中找到最长连续序列长度的程序的时间复杂度是多少?

从给定的未排序整数数组中找到最长连续元素序列的长度

找到最长的连续交替序列

长度的连续子序列

长度不同时的最长子序列问题

取消列出连续包含多个值的列表

子序列的最大长度,以使得每个连续元素的按位XOR为k

给定一个仅包含0、1或2s的字符串,请计算具有相等数量的0s,1s和2s的子字符串的数量

查找最大数量为1s的2D数组的连续行

numpy使二进制矩阵轮廓连续并用1s填充

python列表中最长的连续重复序列

如何找到最长的连续日期序列?

返回最长连续的测距整数序列

最长连续子序列的 Pythonic 方法

每个元素小于 3 的最长连续序列