【问题标题】:Check there exists any number appears at least array.size()/4 times [duplicate]检查是否存在任何数字至少出现 array.size()/4 次 [重复]
【发布时间】:2019-01-05 22:23:58
【问题描述】:

给定一个未排序的数组,但相同的元素彼此相邻。 是否可以检查数组是否包含至少出现 array.size()/4 次的任何元素?

使用哈希表进行线性扫描是微不足道的,我想知道是否有任何算法的复杂性更好。

谢谢。

【问题讨论】:

  • 是的,如果存在这样的元素,那么这意味着如果你检查0n/82n/8,...和3n/4,至少两次相同的元素出现,然后我们可以使用二进制搜索来找到该元素的边界,并检查它是否出现了所需的数量。
  • 我不得不不同意标记的重复 - 该问题不提供相同元素彼此相邻的条件,因此正如@WillemVanOnsem 所描述的那样,该问题存在渐近更快的算法。
  • @WillemVanOnsem:我猜你一开始建议使用 n/4 的倍数来发现向下舍入的问题 - 在更改为 n/8 时错过了一次。我认为大约 0、n/5、2n/5、3n/5、4n/5 和 n-1 的六个探针就足够了。
  • @greybeard:是的,这是一个错误,但我认为总体思路仍然成立 :)
  • 这个问题真的不应该被标记为重复(虽然相关),我明确将其标记为二进制搜索类别以避免人们误认为这两个是相同的问题。

标签: algorithm binary-search


【解决方案1】:

如果相同的元素总是彼此相邻,只是为了遍历并找到具有最大条目数的元素。 如果最大值

int index=0, currentSize, maxSize = 0, currentElem;
while (index<array.length){
  currentElem = array[index];
  currentSize = 1;
  index++;
  while (index<array.length && currentElem==array[index]){
   currentSize++;
   index++;
  }

  if (maxSize<currentSize) {
    maxSize = currentSize;
  }
}

if (maxSize>=array.length/4) return "Yes";
else return "No";

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2017-03-14
    相关资源
    最近更新 更多