【问题标题】:Array coding challenge that needs to be solved in O(n) complexity需要以 O(n) 复杂度解决的数组编码挑战
【发布时间】:2016-06-22 02:46:17
【问题描述】:

给定一个由 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;
}

感谢您的帮助!

【问题讨论】:

  • 提示:第一次遍历数组并计算 X 的数量。然后在第二遍找到答案。
  • 作业由您完成。尝试自己解决,如果遇到任何问题,请提出具体问题。
  • Jeetendra,截止日期已经过去,这是一个我无法访问的编码挑战。它只是卡在我的脑海里。 samgak,我按照你说的做了,但是第二遍我不知道该怎么做。
  • 如果你统计到当前K的X个数,如果你知道数组的总数和大小,你能不能算出余数中的非X?
  • 三阁,谢谢。我得到了它。在第二遍中,我不断重复数组两次。

标签: c++ arrays algorithm time-complexity


【解决方案1】:

让我们看看你的例子......

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

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

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

所以,到目前为止,我们已经平衡了 5 和非 5,因为我们从末端开始工作。现在我们看左边的下一个位置,也是一个5,所以我们把右边的位置向左移动,直到找到另一个非5:

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

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

【讨论】:

  • 是的,这似乎是另一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多