需要在O(n)复杂度中解决的数组编码挑战

时间:2016-06-22 02:46:17

标签: c++ arrays algorithm time-complexity

我们得到一个由N个数字和数字X组成的数组。我们需要在这个数组中找到一个索引K,它将数组分成两部分(0到K-1,K-1到N-1) )因此:

  

第一部分中等于X的元素数量=第二部分中不等于X的元素数量。

     

示例:

A = (5, 5, 1, 2, 3, 4, 5), X = 5

Answer: K= 4

(5, 5, 1, 2) contains two X's.

(3, 4, 5)  contains two non X's.
     

根据问题描述,这种K总是存在的。解决方案需要具有O(N)复杂度。 O(N ^ 2)溶液太容易了,但我找不到O(N)溶液。

这是我到目前为止所拥有的:

int function(int X, vector<int> &A) {
    int k = 0;
    vector<int> indices;
    long count = A.size();
    int number_of_x= 0;
    for(int i=0;i<count;i++){
        if(A[i]==X)
            number_of_x++;
    }
    long part_one_x = 0;
    long part_two_nonx = 0;
    for(int i=0;i<count;i++){
        if(A[i]==X)
            part_one_x++;
        part_two_nonx = (count-i) - (number_of_x - part_one_x);
        if(part_one_x == part_two_nonx)
            k = i;
    }


    return k;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

让我们考虑你的例子......

 A = (5, 5, 1, 2, 3, 4, 5)

如果你考虑第一个元素 - 5 - 那么我们知道任何解决方案必须在另一端有一个非5值,所以我们向后工作以找到第一个非五个,跟踪“前面”和“返回“我们正在工作的地点......

 A = (5, 5, 1, 2, 3, 4, 5)
      ^              ^

所以,到目前为止,我们已经将5s与非5s进行了平衡,因为我们从最终开始工作。现在我们看一下左边的下一个位置,也就是五个位置,所以我们向左移动右手位置,直到找到另一个非五位:

 A = (5, 5, 1, 2, 3, 4, 5)
         ^        ^

现在我们推进左侧位置寻找另外五个位置,但在找到一个之前击中了正确位置,因此“右侧”位置是一个解决方案。