找到一组数字的最大子集,以使任意两个数字之和不能被给定数字整除

库尔特·皮克

我正在尝试解决如下所述的Hackerrank问题不可分割子集

在此处输入图片说明

我尝试了以下解决方案(适用于示例测试用例):

# The lines below are for Hackerrank submissions
# n, k = map(int, raw_input().strip().split(' '))
    # a = map(int, raw_input().strip().split(' '))

n = 4
k = 3
a = [1, 7, 2, 4]

while True:
    all_pairs = [(a[i],a[j]) for i in range(len(a)) for j in range(i+1,len(a))]
    tested_pairs = {pair: (pair[0] + pair[1]) % k != 0 for pair in all_pairs}
    disqualified_pairs = {key: value for key, value in tested_pairs.iteritems() if not value}.keys()
    if not disqualified_pairs:
        break
    occurrences = list(sum(disqualified_pairs, ()))
    counts = map(lambda x: occurrences.count(x), a)
    index_remove = counts.index(max(counts))
    a.remove(index_remove)

print len(a)

我要做的是确定“违规”对,并删除a其中最频繁发生的元素,直到没有“违规”对为止。

但是,对于大多数测试用例,我都会遇到“运行时错误”:

在此处输入图片说明

Presumably the algorithm above works in this simple case where only one number (the number 2) needs to be removed, but fails in more complicated test cases. Can anyone see what is wrong with it?

UPDATE

Following poke's suggestion to test k = 2 and a = [1, 2, 3], I made the following modifications:

n = 4
k = 2
a = [1, 2, 3]

while True:
    all_pairs = [(a[i],a[j]) for i in range(len(a)) for j in range(i+1,len(a))]
    disqualified_pairs = [pair for pair in all_pairs if (pair[0] + pair[1]) % k == 0]
    if not disqualified_pairs:
        break
    offending_numbers = sum(disqualified_pairs, ())   # 'Flatten' the disqualified pairs into a single list
    counts = {el: offending_numbers.count(el) for el in set(offending_numbers)}     # Count occurrences of each offending number
    number_to_remove = max(counts, key=counts.__getitem__)
    a.remove(number_to_remove)

print len(a)

The resulting a is [2, 3] and contains two elements as expected. I've also checked that it still works for the original example. However, I am still getting a "Segmentation Fault" on some of the test cases:

在此处输入图片说明

According to https://www.hackerrank.com/challenges/pairs/forum/comments/9154, segmentation faults typically occur because of invalid memory access (array indices which don't exist, etc.). I still haven't managed to find any other test cases, though, where the algorithm fails. Any ideas?

hk6279

Instead of generating all pairs, this could be done by counting modulus.

Time Complexity: O(n + k)

Space Complexity: O(k) or O(1), because k is 100 at max, O(k) => O(1)


Basic idea

(a + b) % k = ((a % k) + (b % k)) % k

Since (a % k) is in range [0, k-1],

(a % k) + (b % k) is in range [0, 2k-2]

In addition,

(a + b) % k = 0 when

  1. (a % k) = 0 and (b % k) = 0 OR

  2. (a % k) + (b % k) = k

Main idea

  1. 基于条件2,当您选择模数i的任何值时,您可以选择任何模数的任何值,模数ki除外。
  2. 在大多数情况下,选择一个以上的模数i值没有冲突。
  3. 根据条件1,您可以从模数0中选择最多1个值
  4. 当k为偶数时,k / 2 + k / 2 = k。当k为偶数时,您可以从模数k / 2中最多选择1个值

根据以上信息,解决方案可能是

  1. 如果n <2,则返回n
  2. 创建一个大小为k且所有初始值为0的数组,表示为Arr,以存储模数
  3. 在索引为0到n-1的数组a上循环,将1加到Arr [a [i]%k]
  4. 初始化一个初始值为0的计数器
  5. 在索引为i的数组Arr上循环从1到k-(k / 2)-1,将Max(Arr [i],Arr [ki])添加到计数器
  6. 如果Arr [0]> 0,则将1加到计数器
  7. 如果k%2 = 0且Arr [k / 2]> 0,则将1加到计数器
  8. 退货柜台

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在排序数组中找到一个是另外两个数字之和的数字

来自分类Dev

将给定的一组数字N分成两组,以使它们的总和之差最小?

来自分类Dev

可被给定的两个数字整除的N位数字的数量

来自分类Dev

获取一组给定数字中具有相同数字频率的组的数量

来自分类Dev

两个数字的最大AND

来自分类Dev

Excel-在一组数字中找到最大的差距?

来自分类Dev

安排一个整数数组,使两个连续的数字之和不被3整除

来自分类Dev

过滤列中一组给定数字中可用的数字

来自分类Dev

给定目标总和和一组整数,找到添加到该目标的最接近的数字子集

来自分类Dev

用两个数字子集值

来自分类Dev

在两个给定数字之间获取4个数字(步骤)

来自分类Dev

给定数字可以写为两个或多个连续正整数之和吗?

来自分类Dev

使用一组数字相加为特定数字

来自分类Dev

给定两个数字的XOR和SUM。如何找到数字?

来自分类Dev

如何在Java中找到两个给定整数之间的数字之和

来自分类Dev

在数组中查找三元组,以便两个数字的和也是给定数组中的数字

来自分类Dev

快速找到两个数字的GCD

来自分类Dev

不能随机产生两个数字之间的数字

来自分类Dev

如何找到可被给定范围内的数字整除的数字?

来自分类Dev

可以使用给定的一组数字生成的固定长度的不同序列数

来自分类Dev

从一组给定的数字中找到回文序列的数量

来自分类Dev

构造一个循环来检查一个数字的数字之和是否可以被 3 整除

来自分类Dev

如何在Excel中找到给定数字的最大序列?

来自分类Dev

计算给定数字到两个给定数字之间的百分比

来自分类Dev

给定一个整数数组,找到两个数字,使它们加起来成为一个特定的目标数字

来自分类Dev

给定一个整数数组,找到两个数字,使它们加起来成为一个特定的目标数字

来自分类Dev

给定一个已排序的数组和一个参数k,找到两个大于或等于k的数字之和

来自分类Dev

找到 1 到 k 之间 n 个数字的所有唯一组合

来自分类Dev

查找一组数组的最大子集(内核)的算法

Related 相关文章

  1. 1

    在排序数组中找到一个是另外两个数字之和的数字

  2. 2

    将给定的一组数字N分成两组,以使它们的总和之差最小?

  3. 3

    可被给定的两个数字整除的N位数字的数量

  4. 4

    获取一组给定数字中具有相同数字频率的组的数量

  5. 5

    两个数字的最大AND

  6. 6

    Excel-在一组数字中找到最大的差距?

  7. 7

    安排一个整数数组,使两个连续的数字之和不被3整除

  8. 8

    过滤列中一组给定数字中可用的数字

  9. 9

    给定目标总和和一组整数,找到添加到该目标的最接近的数字子集

  10. 10

    用两个数字子集值

  11. 11

    在两个给定数字之间获取4个数字(步骤)

  12. 12

    给定数字可以写为两个或多个连续正整数之和吗?

  13. 13

    使用一组数字相加为特定数字

  14. 14

    给定两个数字的XOR和SUM。如何找到数字?

  15. 15

    如何在Java中找到两个给定整数之间的数字之和

  16. 16

    在数组中查找三元组,以便两个数字的和也是给定数组中的数字

  17. 17

    快速找到两个数字的GCD

  18. 18

    不能随机产生两个数字之间的数字

  19. 19

    如何找到可被给定范围内的数字整除的数字?

  20. 20

    可以使用给定的一组数字生成的固定长度的不同序列数

  21. 21

    从一组给定的数字中找到回文序列的数量

  22. 22

    构造一个循环来检查一个数字的数字之和是否可以被 3 整除

  23. 23

    如何在Excel中找到给定数字的最大序列?

  24. 24

    计算给定数字到两个给定数字之间的百分比

  25. 25

    给定一个整数数组,找到两个数字,使它们加起来成为一个特定的目标数字

  26. 26

    给定一个整数数组,找到两个数字,使它们加起来成为一个特定的目标数字

  27. 27

    给定一个已排序的数组和一个参数k,找到两个大于或等于k的数字之和

  28. 28

    找到 1 到 k 之间 n 个数字的所有唯一组合

  29. 29

    查找一组数组的最大子集(内核)的算法

热门标签

归档