给定一个2n个元素的数组,其中n个元素相同,其余n个元素都不同。编写一个C程序,找出数组中出现n次的值
我以下列方式思考 - 比较a [i]和[i + 1]和 比较a [i]和[i + 2] 并返回元素
这将在O(n)时间内运行..任何人都可以提供更好的解决方案吗?
我正在经历一些像这样说的解决方案 -
- 声明两个变量a)计数变量以跟踪多数元素的计数。
- 多数元素。
- 执行for循环并在步骤4-6之后重复,直到到达阵列结束。
- 如果当前数组元素等于多数元素,则递增计数
- 否则,如果count为0,则使用当前数组元素和增量计数更新多数元素。
- 如果count不为0则为else,然后递减计数。
- 做另一个for循环并计算数组中多数元素的出现次数,如果它是数组大小的一半,那么我们找到了多数元素,否则没有多数元素。
醇>
答案 0 :(得分:5)
您可以使用多数元素算法作为O(1)空间的O(n)解决方案的基础。
您需要一个存储元素的空间。选择第一个元素并存储它,如果下一个元素与存储的元素相同,则完成。如果没有,请从下一步重新启动算法。如果你在结束后找不到元素,则意味着元素是成对排序的,如(a,b),(a,c),(a,d)或(b,a), (a,c),(a,d),(e,a)..比较前四个元素,你发现了副本。
由于元素可以按任意顺序排列,因此无论您选择哪个前n / 2个元素,它们都可能是不同的。所以没有比O(n)更好的解决方案。
答案 1 :(得分:1)
这是一个通过使用线性时间多数投票算法(http://www.cs.utexas.edu/~moore/best-ideas/mjrty/index.html)最多两次通过和O(1)空间的解决方案)
选择第一个元素并扫描数组以确定这是否是重复元素(扫描剩余数组的一半就足够了)。如果元素是重复元素,那么我们就完成了;如果没有,则在重新生成数组中应用线性时间多数投票算法。
我们检查第一个元素的原因是线性时间多数表决仅在元素重复数组中元素数量的一半以上时才有效。