O(n)中的连续子阵列解决方案

时间:2018-05-21 06:21:03

标签: algorithm time-complexity

最近我遇到一个问题,说明有一个整数数组,我们将得到一个通配符号码。我们需要查看数组并形成一个子数组,以便

  1. 通配符号码应该是子数组的最后一个元素(即 :{2,3,4}有效,如果4是外卡号但{2,4,3}无效)。
  2. 外卡号码前的所有元素应小于 那。 (即:{2,3,4}有效,如果4是外卡号码,但{5,2,4} 无效)。
  3. 外卡号码不应该在两个子阵列之间进行分组。
  4. 输出应返回此类子数组的长度。

    示例问题: 如果数组为{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 个答案:

答案 0 :(得分:1)

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

可以修改您的解决方案以防止向后遍历并仅使用向前遍历。