检查是否可以通过Python上的三个操作将数组和设为K
假设我们有一个称为nums的数字列表,并且还有一个正值K。我们可以对nums进行这三个操作中的任何一个-
将一个数字设为负数
将数字的索引(从索引1开始)添加到数字本身
从数字本身减去数字的索引。
最后,通过对每个元素仅执行一次这些操作,我们必须检查给定数组是否可以在数组的总和变为k时进行转换。
因此,如果输入像nums=[1,2,3,7]k=8,则输出将为True,因为我们可以从2和3中减去2和3的索引,以使数组成为[1,0,0,7],因此总和为8=k。
为了解决这个问题,我们将遵循以下步骤-
大小:=100
定义功能is_ok()。这将需要i,total,k,nums,table
n:=nums的大小
如果合计<=0,则
返回False
如果i>=n,则
返回True
如果总数等于k,则
返回False
如果table[i,total]不为-1,则
返回表[i,总计]
table[i,total]:=1,当(is_ok(i+1,total-2*nums[i],k,nums,table)为非零或is_ok(i+1,total,k,nums,table)非零),否则为0
table[i,total]:=1(is_ok(i+1,total-(i+1),k,nums,table)或table[i,total]),否则为0
table[i,total]:=1(is_ok(i+1,total+i+1,k,nums,table)或table[i,total]),否则为0
返回表[i,总计]
从主要方法中执行以下操作-
总计:=所有元素的总和
table:=长度与大小相同的数组,并用-1填充
对于介于0到大小范围内的i,执行
table[i]:=长度与大小相同的数组,并用-1填充
返回is_ok(0,total,k,nums,table)
让我们看下面的实现以更好地理解-
示例
size = 100 def is_ok(i, total, k, nums, table): n = len(nums) if total <= 0: return False if i >= n: if total == k: return True return False if table[i][total] != -1: return table[i][total] table[i][total] = is_ok(i+1, total - 2 * nums[i], k, nums, table) or is_ok(i+1, total, k, nums, table) table[i][total] = is_ok(i+1, total - (i+1), k, nums, table) or table[i][total] table[i][total] = is_ok(i+1, total + i + 1, k, nums, table) or table[i][total] return table[i][total] def solve(nums, k): total = sum(nums) table = [-1]*size for i in range(size): table[i] = [-1]*size return is_ok(0, total, k, nums, table) nums = [1,2,3,7] k = 8 print(solve(nums, k))
输入值
[1,2,3,7], 8输出结果
True