我有一个整数数组。我想找出所有唯一的集合,其中的差异是1,并将它们分离为唯一的集合。
输入实例: 3,4,5,8,9,11
输出示例:{3,4,5},{8,9},{11}
用Python做这件事最简单的方法是什么?
发布于 2022-06-16 22:50:18
捕获链的开始,并将链的所有元素添加到一个集合中。
以下是这个想法的超级简单代码:
def f(arr):
res = []
st = set(arr)
for num in st:
if num - 1 not in st: #begin of chain
temp = []
while num in st:
temp.append(num)
num += 1
res.append(temp)
return res
print(f([3,4,5,8,9,11]))
Output: [[3, 4, 5], [8, 9], [11]]
Time complexity: O(n)
Space complexity: O(n)
我想这是我们能达到的最好的复杂性。(不要介意代码中的变量名)
我假设您的输入列表不包含重复项。如果输入为3,4,5,8,9,11,8,9,10,我们是否希望独特的集合为[3,4,5,8,9,10,11,8,9,9]?如果是的话,那我就把它留给你做练习。提示:使用计数器/字典代替上面的设置,这很容易。
发布于 2022-06-16 22:42:48
也许不是最有效率的,但你可以排序,然后分开的差别。下面是一个使用numpy的解决方案:
example_input = [3, 4, 5, 8, 9, 11]
output = np.split(np.sort(example_input),
np.where(np.diff(np.sort(example_input)) > 1)[0] + 1)
这样做的目的是找出排序数组的元素之间的差异大于一个,然后分割输入。我们在下一组中将一个元素添加到要拆分的元素中。
然后,如果您愿意,可以将数组映射到集合。
sets = [set(x) for x in output]
# [{3, 4, 5}, {8, 9}, {11}]
发布于 2022-06-16 22:43:40
您可以从第一个数字开始,并将其递增1,直到您得到的新值不在原始列表( anymore.
这应该能让你开始
import typing
def find_unique(elems: list[int]) -> set[int]:
... # fill in your code here
def find_all_unique(elems: list[int]) -> typing.Iterator[set[int]]:
while (elems):
yield find_unique(elems)
if __name__ == '__main__':
my_list = [3,4,5,8,9,11]
print list(find_all_unique(my_list))
https://stackoverflow.com/questions/72652538
复制相似问题