找到数组的子集,使子集中的元素具有共同的差异

时间:2015-07-03 14:47:56

标签: arrays subset difference

我在准备面试时遇到了一个问题。 给定一个整数数组作为输入。 我们找到了一个可能的子集,使得数组中的元素具有共同的差异。 例如, 考虑输入数组为{1,3,7,10,11} 那么输出应该是{3,7,11}。 始终是数组中的元素按递增顺序排列。 我想找到所有子集并寻找解决方案。 但是如果输入数组太大,那将导致我的程序运行速度变慢。 任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

据我所知,您希望从数组中提取可能的子集,使每两个连续的数字具有相同的差值。

这是我的算法:

  1. 删除重复项。
  2. 强行安排上升。
  3. 保留一个哈希表,其中差值为键,列表列为值。
  4. 循环遍历数组,更新/添加哈希表中的键,该键等于手头两个连续数字之间的差值,并将列表添加到包含两个数字的值(列表列表)中。
  5. 循环后,创建一个数组。循环遍历哈希表,每次向数组本身添加一个元素:数组本身:在手头的值中合并所有嵌套列表。这是包含所有可能子集的数组。
  6. 这是python中可能的实现:

    from itertools import chain
    def find_subsets (array):
        table = dict()
        last = array[-1]
        for num in sorted (set (array), False)[1:]:
            diff = last - num
            table[diff].append([num, last])
            last = num
        return [list(chain(v)) for k, v in table]
    

    如果错误,请尝试使用此代码并进行更正。我匆匆写了这篇文章。