C++ O(n)复杂度下需要解决的阵列编码挑战
我们得到一个由N个数字和一个数字X组成的数组。我们需要在这个数组中找到一个索引K,它将数组分成两部分(0到K-1,K-1到N-1),如下所示: 第一部分中等于X的元素数量=第二部分中不等于X的元素数量 例如: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)复杂性。
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,谢谢。我知道了。我在第二遍重复了两遍数组第二次传球。是的,这似乎是另一种方式。