数组中任选值相加得到目标值

#File Name : 任意数组中的数加出目标值.py

#给定一个数组,和一个数aim ,任意选择arr中的数字
# 不重复选择,相加 若可以等于aim 则返回true

def process(arr,i,sum,aim):
    # arr 数组
    #  i 当前位置 数组的数的位置
    #  sum 当前的和  要之前的数和不要之前的数的和是不一样的
    # aim 固定得数
    if i==len(arr):
        return sum==aim
    return process(arr,i+1,sum,aim) or process(arr,i+1,sum+arr[i],aim)

arr = [3,2,7,13]
aim = 9

print(process(arr,0,0,aim))

 

### 前缀与差分概念 #### 前缀定义 前缀是指对于给定的一个序列 \(a_0, a_1, \ldots, a_{n-1}\),构建一个新的数组 `prefix_sum`,其中每一个位置 i 存储的是原数组从起始位置到当前位置所有元素之。即\[ prefix\_sum[i]=\sum _{j=0}^{i}a[j]\] 。这使得后续可以快速求得任意子区间内的总[^1]。 #### 差分定义 差分则是指创建一个辅助数组 `diff` 来记录相邻两数之间的差异变化情况;当需要对某段连续区域加上某个固定时,只需修改该段两端对应的差分即可达到目的。具体来说就是如果要使闭区间 `[L,R]` 上每项都增加 V,则只需要让 diff[L]+=V diff[R+1]-=V 即可完成操作。 ### 实现方法 #### 计算一维前缀并存储至新数组中 为了方便理解这里给出简单的 Python 函数用于计算一维前缀: ```python def get_prefix_sums(nums): n = len(nums) prefix_sums = [0] * (n + 1) for i in range(n): prefix_sums[i + 1] = prefix_sums[i] + nums[i] return prefix_sums ``` 此代码片段实现了将输入列表转换成其相应的累积求形式,并额外保留了一个初始零以便于之后做减法运算来获取特定区间的累加结果。 #### 应用差分更新指定范围内数 下面展示如何利用差分技巧高效地批量调整某些索引处的数据: ```python def apply_diff_update(diff_arr, start_index, end_index, value_to_add): diff_arr[start_index] += value_to_add if end_index + 1 < len(diff_arr): diff_arr[end_index + 1] -= value_to_add # 将上述更改反映回原始数据 def reconstruct_from_diff(original_length, diff_arr): result = [0] * original_length current_value = 0 for idx in range(len(result)): current_value += diff_arr[idx] result[idx] = current_value return result ``` 这些函数展示了怎样通过仅改变两个端点附近的差分数得以间接影响中间部分的实际取,从而大大减少了重复劳动量。 ### 场景应用实例 在面对频繁询问不同子集内部成员相加的任务背景下,采用前缀技术能够显著降低时间消耗——一旦预处理好了完整的累计表以后每次查询都能瞬间得出结论而不必再重新扫描一遍目标集合中的全部条目[^2]。 另外,在涉及二维平面上矩形区域内整数统计等问题里同样适用类似的思路扩展而成的方法论:比如可以通过维护四个方向上的边界增量信息进而迅速定位任选方格群组所含有的总量等特性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值