K产品阵列
K product array
我正在研究一个算法问题。您有一个数组编号、数组大小 t 、编号 number_of_elements 和编号 multiplication_value。您必须找到数组元素的任意一组 number_of_elements 索引,其乘积将等于 multiplication_value。保证存在这样的一组索引
这个问题看起来像 2 个总和,但我无法将其推断到我的情况。
我已经尝试过 O(n) 的朴素算法,但是当你在数组中有错误的第一个数字时它失败了。我认为这里有一种使用递归的方法。我想这是众所周知的问题,但我找不到解决方案
示例在:
t = 7
number_of_elements = 2
multiplication_value = 27
numbers = [9,1,1,27,3,27,3]
示例:
1 3
我的代码思路:
def return_index_values(numbers,multiplication_value,number_of_elements):
cur_number = int(multiplication_value)
list_of_indexes = []
values = []
for i in range(len(numbers)):
if ((cur_number == 1) and (len(values) == number_of_elements)):
print(values)
#finishing if everything worked
break
else:
if (cur_number % int(numbers[i]) == 0):
if(len(values) < number_of_elements):
#pushing values if possible
values.append(int(numbers[i]))
list_of_indexes.append(i)
cur_number = int(cur_number / int(numbers[i]))
print(cur_number)
else:
pass
if(len(values) == number_of_elements):
if mult_check(values,int(multiplication_value)):
#mult_check checks if the array's element multiplication gives a value
break
else:
#started dealing with bad cases, but it doesn't work properly
values.sort()
val_popped = values.pop()
cur_number = cur_number * val_popped
我的代码不合适
numbers = [9,3,1,27,3,27,3]
您可以使用 itertools.combinations() (https://www.geeksforgeeks.org/itertools-combinations-module-python-print-possible-combinations/) 以所有可能的方式从您的列表中 select number_of_elements 条目,然后检查它们是否乘以所需数量。
这是一种实现方式。不一定是最好的解决方案,但它可以让您了解如何完成。
它首先根据保留索引信息的元素对 numbers
进行排序。然后它执行递归调用。
number_of_elements = 2
multiplication_value = 27
numbers = [9,1,1,27,3,27,3]
def preprocess(numbers, multiplication_value, number_of_elements):
l = []
for i, num in enumerate(numbers):
l.append((num, i))
return sorted(l, key = lambda tup: tup[0])
def subroutine(numbers, multiplication_value, number_of_elements, idx_start, result):
if idx_start >= len(numbers):
return False
if number_of_elements == 0:
return True if multiplication_value == 1 else False
for i in range(idx_start, len(numbers)):
num = numbers[i][0]
if num <= multiplication_value:
if multiplication_value % num == 0:
idx = numbers[i][1]
result.append(idx)
found = subroutine(numbers, multiplication_value / num, number_of_elements - 1, i + 1, result)
if not found:
del result[-1]
else:
return True
else:
return False
return False
result = []
processed_numbers = preprocess(numbers, multiplication_value, number_of_elements)
subroutine(processed_numbers, multiplication_value, number_of_elements, 0, result)
print(result)
我正在研究一个算法问题。您有一个数组编号、数组大小 t 、编号 number_of_elements 和编号 multiplication_value。您必须找到数组元素的任意一组 number_of_elements 索引,其乘积将等于 multiplication_value。保证存在这样的一组索引
这个问题看起来像 2 个总和,但我无法将其推断到我的情况。 我已经尝试过 O(n) 的朴素算法,但是当你在数组中有错误的第一个数字时它失败了。我认为这里有一种使用递归的方法。我想这是众所周知的问题,但我找不到解决方案
示例在:
t = 7
number_of_elements = 2
multiplication_value = 27
numbers = [9,1,1,27,3,27,3]
示例:
1 3
我的代码思路:
def return_index_values(numbers,multiplication_value,number_of_elements):
cur_number = int(multiplication_value)
list_of_indexes = []
values = []
for i in range(len(numbers)):
if ((cur_number == 1) and (len(values) == number_of_elements)):
print(values)
#finishing if everything worked
break
else:
if (cur_number % int(numbers[i]) == 0):
if(len(values) < number_of_elements):
#pushing values if possible
values.append(int(numbers[i]))
list_of_indexes.append(i)
cur_number = int(cur_number / int(numbers[i]))
print(cur_number)
else:
pass
if(len(values) == number_of_elements):
if mult_check(values,int(multiplication_value)):
#mult_check checks if the array's element multiplication gives a value
break
else:
#started dealing with bad cases, but it doesn't work properly
values.sort()
val_popped = values.pop()
cur_number = cur_number * val_popped
我的代码不合适
numbers = [9,3,1,27,3,27,3]
您可以使用 itertools.combinations() (https://www.geeksforgeeks.org/itertools-combinations-module-python-print-possible-combinations/) 以所有可能的方式从您的列表中 select number_of_elements 条目,然后检查它们是否乘以所需数量。
这是一种实现方式。不一定是最好的解决方案,但它可以让您了解如何完成。
它首先根据保留索引信息的元素对 numbers
进行排序。然后它执行递归调用。
number_of_elements = 2
multiplication_value = 27
numbers = [9,1,1,27,3,27,3]
def preprocess(numbers, multiplication_value, number_of_elements):
l = []
for i, num in enumerate(numbers):
l.append((num, i))
return sorted(l, key = lambda tup: tup[0])
def subroutine(numbers, multiplication_value, number_of_elements, idx_start, result):
if idx_start >= len(numbers):
return False
if number_of_elements == 0:
return True if multiplication_value == 1 else False
for i in range(idx_start, len(numbers)):
num = numbers[i][0]
if num <= multiplication_value:
if multiplication_value % num == 0:
idx = numbers[i][1]
result.append(idx)
found = subroutine(numbers, multiplication_value / num, number_of_elements - 1, i + 1, result)
if not found:
del result[-1]
else:
return True
else:
return False
return False
result = []
processed_numbers = preprocess(numbers, multiplication_value, number_of_elements)
subroutine(processed_numbers, multiplication_value, number_of_elements, 0, result)
print(result)