代码之家  ›  专栏  ›  技术社区  ›  Bala Ji

o(n)中的连续子数组解决方案

  •  0
  • Bala Ji  · 技术社区  · 7 年前

    最近我遇到了一个问题,说明存在整数数组,我们将得到一个通配符。我们需要查看数组并形成一个子数组,这样

    1. 通配符应该是子数组的最后一个元素(即 :2,3,4如果4是通配符,则有效,但2,4,3无效)。
    2. 通配符之前的所有元素应小于 那。(即:2,3,4是有效的,如果4是通配符,但5,2,4 无效)。
    3. 不应在两个子数组之间组合通配符。

    输出应返回此类子数组的长度。

    示例问题: 如果数组是4、5、6、4、3、2、4、8、2、4且通配符为4,则输出应为7。(因为子数组是4、4、3,2,4、2,4)。

    我已经为这个问题编写了代码。但我需要知道的是,这个解决方案是否可以用O(N)时间复杂性来编写。还有一种方法可以通过单独查看问题来找到可能的最佳时间复杂性。

    代码段:

    private static void solution(int[] array, int k)
        {
            int forwardCounter = 0;
            int backwardCounter = 0;
            int length = 0;
    
            while(forwardCounter != array.length)
            {
                if(array[forwardCounter] == k)
                {
                    length++;
                    backwardCounter = forwardCounter - 1;
                    while(backwardCounter >= 0)
                    {
                        if(backwardCounter >= 0 && array[backwardCounter--] < k)
                        {
                            length++;
                        }
                        else
                            break;
                    }
                }
                forwardCounter++;
            }
            System.out.println(length);
        }
    
        public static void main(String[] args) 
        {
            solution(new int[]{4,5,6,4,3,2,4,8,2,4}, 4);
        }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   mangusta    7 年前

    您的解决方案是线性的,但在最坏的情况下,您的数组将被遍历两次。最坏的情况显然发生在
    -数组按升序排序
    -通配符是数组的最后一个(即最大的)元素

    您的解决方案可以通过防止反向遍历和仅使用正向遍历的方式进行修改。