Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ O(n)复杂度下需要解决的阵列编码挑战_C++_Arrays_Algorithm_Time Complexity - Fatal编程技术网

C++ O(n)复杂度下需要解决的阵列编码挑战

C++ O(n)复杂度下需要解决的阵列编码挑战,c++,arrays,algorithm,time-complexity,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)复杂性。

我们得到一个由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;
}
int函数(intx,vector&A){
int k=0;
向量指数;
长计数=A.大小();
整数x=0;

对于(int i=0;i)让我们考虑一下你的例子…

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

如果你考虑第一个元素- 5 -那么我们知道任何解决方案都必须在另一端有一个非-5值,所以我们向后工作来寻找第一个非五,跟踪我们正在工作的“前面”和“后退”位置……/P>

 A = (5, 5, 1, 2, 3, 4, 5)
      ^              ^
因此,我们已经平衡了5s和非5s,因为我们从末端开始工作。现在我们看左边的下一个位置,也是5,所以我们将右手位置向左移动,直到找到另一个非5:

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

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

提示:第一次遍历数组并计算X的数量。然后在第二次遍历时找到答案。作业应该由您完成。如果您遇到任何问题,请尝试自己解决并提出具体问题。Jeetendra,截止日期已经过了,这是一个编码挑战,我不知道有权访问。它只是停留在我的脑海中。samgak,我按照你说的做了,但我不知道在第二遍中该做什么。如果你将X的数量计算到当前的K,你不能计算剩余部分中的非X吗,如果你知道数组的总数和大小吗?samgak,谢谢。我知道了。我在第二遍重复了两遍数组第二次传球。是的,这似乎是另一种方式。