我们得到一个由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;
}
感谢您的帮助!
答案 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)
^ ^
现在我们推进左侧位置寻找另外五个位置,但在找到一个之前击中了正确位置,因此“右侧”位置是一个解决方案。