algorithm - 通过用 '1' 替换任何一个 '0' 来查找二进制数组中最长的 '1' 序列

标签 algorithm data-structures

我有一个仅由 0 和 1 组成的数组。任务是找到 0 的索引,将其替换为 1 会导致给定数组的最长可能序列。 解决方案必须在 O(n) 时间和 O(1) 空间内工作。

例如:

数组 - 011101101001
答案 - 4(产生 011111101001)

我的方法给出了比 O(n2) 更好的结果,但在输入长字符串时超时。

int findIndex(int[] a){

    int maxlength = 0; int maxIndex= -1;
    int n=a.length;
    int i=0; 
    while(true){

        if( a[i] == 0 ){
            int leftLenght=0;
            int j=i-1;
            //finding count of 1s to left of this zero
            while(j>=0){
                if(a[j]!=1){
                    break;
                }
                leftLenght++;
                j--;
            }

            int rightLenght=0;
            j=i+1;
            // finding count of 1s to right of this zero
            while(j<n){
                if(a[j]!=1){
                    break;
                }
                rightLenght++;
                j++;
            }

            if(maxlength < leftLenght+rightLenght + 1){
                maxlength = leftLenght+rightLenght + 1;
                maxIndex = i;
            }
        }
        if(i == n-1){
            break;
        }
        i++;
    }
    return maxIndex;
}

最佳答案

方法很简单,只需要在遍历数组的时候维护两个数,一个的连续 block 的当前个数,一个的最后一个连续 block 的个数,用零隔开。

注意:该解法假设数组中至少有一个零,否则返回-1

int cal(int[]data){
    int last = 0;
    int cur = 0;
    int max = 0; 
    int start = -1; 
    int index = -1;
    for(int i = 0; i < data.length; i++){
        if(data[i] == 0){
           if(max < 1 + last + cur){
              max = 1 + last + cur;
              if(start != -1){
                index = start;
              }else{
                index = i;
              }
           }
           last = cur;
           start = i;
           cur = 0;  
        }else{
            cur++;
        }
    }
    if(cur != 0 && start != -1){
       if(max < 1 + last + cur){
          return start;
       }
    }     
    return index;
}

O(n) 时间,O(1) 空间

现场演示:https://ideone.com/1hjS25

关于algorithm - 通过用 '1' 替换任何一个 '0' 来查找二进制数组中最长的 '1' 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52588825/

相关文章:

java - 什么是存储整数对的 O(1) 搜索内存高效数据结构?

java - AVL 树实现 - 不存储高度

algorithm - 替代排序算法小于 O(nlog(n))

javascript - 为什么我的 javascript 二进制搜索出错?

algorithm - 获取 n! 行列式的有效方法xn! Maple 中的矩阵

mysql - 数据库、JSON 和嵌入式数据库

python - 在 pdist 压缩距离矩阵中找到最小值的索引

arrays - 如何计算两个重叠线性数据集之间的点?

c# - 数据包重传模式

c - 使用链接列表并删除节点或使用数组并对字符串进行小计算以查看是否可以跳过元素是否更有效?