浮点数的连续子数组和整数算法

Posted

技术标签:

【中文标题】浮点数的连续子数组和整数算法【英文标题】:Contiguous subarray of floating numbers sums to integer algorithm 【发布时间】:2020-02-17 20:14:36 【问题描述】:

假设我们有一个大小为 n 的数组 A,有 n 个未排序的浮点数。我们想找到一个连续的子数组 B 使得 B 总和为一个整数。假设我们可以以 O(1) 的成本使用 floor 函数。请注意,如果存在这样的 B,我们需要返回 B。 我的想法:

rsum = running sum of A(i.e. rsum[i]=A[1]+A[2]+...+A[i])
for i from 1 to n:
   for j from i to n:
      e = rsum[j]-rsum[i]+A[i]
      if e==floor(e)
         return A[i....j]
return "no such subarray"

这是一个 O(n^2) 算法,有没有办法在 o(n^2) 中做到这一点?

【问题讨论】:

【参考方案1】:

如果我们忽略浮点计算错误,那么我们可以将运行和的小数部分放入映射中,并检查相同的小数是否存在两次 - (接近)O(n) 方法。

考虑到精度问题,我们可以对分数进行排序(或将它们放入像 RB 树这样的排序容器中)并得到最小的差异 - O(nlogn) 方法

【讨论】:

一张地图的插入时间不合适 O(1​​),因此插入所有元素和检查重复项的总体 O(n) 也不合适。 是的,我知道,但 O(1) 是典型时间,通常用于粗略估计

以上是关于浮点数的连续子数组和整数算法的主要内容,如果未能解决你的问题,请参考以下文章

将 strlen() 与数组整数或浮点数一起使用 [重复]

结对开发——返回一个整数数组中最大子数组的和

将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”

字节数组byte[]和整型,浮点型数据的转换——Java代码

找出一个整数数组的和最大的连续子数组

正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)