数组和为K的组合

本文介绍了一种寻找数组中两数或三数之和等于特定值K的所有可能组合的方法,包括排序+指针、排序+二分查找及哈希表等高效算法,并提供了Python代码实现。
部署运行你感兴趣的模型镜像

1. 求数组中两数相加和为K的所有组合

1.1 排序+指针

1. 先将数组排序 o(nlogn);

2. 再使用两个指针 o(n)。

1. 代码实现

def two_num_sum_k(arr, k):
    if not arr or len(arr) < 2:
        return []
    result = []
    arr.sort()
    low, high = 0, len(arr) - 1
    while low < high:
        sum = arr[low] + arr[high]
        if sum == k:
            result.append((arr[low], arr[high]))
            low += 1
            high -= 1
        elif sum < k:
            low += 1
        else:
            high -= 1
    return result

2. 测试

a = [-1, -2, 3, 4, 5, 6, 7]
k = 5
print(two_num_sum_k(a, k))
# [(-2, 7), (-1, 6)]

1.2 排序+二分查找

1. 先将数组排序 o(nlogn);

2. 再二分查找k-a[i]。 o(logn)*N

1.3 hash表

1. 先用hash表缓存 o(n);

2. 再在hash表中查找k-a[i]。 o(1)*N

2. 求数组中三数相加和为K的所有组合

3个数和为k  <=>  a+b=k-c 时间复杂度o(nlogn) 

1. 代码实现

def three_num_sum_k(arr, k):
    if not arr or len(arr) < 3:
        return []
    result = []
    arr.sort()
    for i in range(len(arr)-2):
        low, high = i+1, len(arr) - 1
        while low < high:
            sum = arr[i] + arr[low] + arr[high]
            if sum == k:
                result.append((arr[i], arr[low], arr[high]))
                low += 1
                high -= 1
            elif sum < k:
                low += 1
            else:
                high -= 1
    return result

2. 借助两数和为k

def three_num_sum_k2(arr, k):
    result = []
    if not arr or len(arr) < 3:
        return result
    arr.sort()
    # 深拷贝一份,确保for循环时数组不变
    a = arr.copy()
    for x in arr:
        a.remove(x)
        temp = two_num_sum_k(a, k-x)
        if temp:
            for item in temp:
                result.append((x, item[0], item[1]))
    return result

3. 测试

a = [-1, -2, 3, 4, 5, 6, 7]
print(three_num_sum_k(a, k=8))
print(three_num_sum_k2(a, k=8))
# [(-2, 3, 7), (-2, 4, 6), (-1, 3, 6), (-1, 4, 5)]

3. 思路分析

数组A中N个数和为K的一组解

1. N-1个数中是否有和为K的解;

2. N-1个数中是否有和为K-A[N-1]的解;

DP动态规划方程:

P[N][K] = P[N-1][K]  || P[N-1][K-A[N-1]]

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 为k的连续子数组问题 对于为k的连续子数组问题,可以通过前缀与哈希表相结合的方法高效解决。这种方法的核心思想在于利用前缀的概念减少重复计算,并借助哈希表存储中间结果以加速查询过程。 #### 前缀概念 前缀是一种用于快速计算区间的技术。定义 `prefix_sum[i]` 表示从数组起始位置到第i个元素之间的累计,则任意子数组 `[j, i]` 的可通过如下公式得到: \[ \text{subarray\_sum[j:i]} = \text{prefix_sum[i]} - \text{prefix_sum[j-1]} \] 如果存在某个索引 \( j \),使得 \( prefix\_sum[i] - prefix\_sum[j-1] = k \),那么我们找到了一个满足条件的子数组[^3]。 #### 使用哈希表优化查找 为了进一步提高效率,在遍历过程中维护一个哈希表记录已经遇到过的前缀及其出现次数。当处理当前元素时,检查是否存在 \( prefix\_sum[i] - k \) 已经存在于哈希表中;如果有,则表示之前某些位置上的前缀加上当前位置之后的部分正好构成目标值k的一个有效子数组组合[^5]。 以下是基于上述原理的具体Python实现: ```python def subarraySum(nums, k): count = 0 sums = 0 d = {0: 1} # 初始化字典,键为前缀,值为其出现次数 for num in nums: sums += num if (sums - k) in d: count += d[sums - k] if sums not in d: d[sums] = 0 d[sums] += 1 return count ``` 此函数接收两个参数:一个是整数列表nums代表待分析的数据序列;另一个是整数值k作为期望达到的目标总。它会返回符合条件的不同子数组数目[^4]。 ### 结论 通过采用前缀配合哈希表的方式能够有效地降低时间复杂度至线性级别(O(n)),从而解决了传统暴力枚举方法所带来的性能瓶颈问题[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值