数组和为K的组合

面试算法总结系列——和为K的算法 这里引入几个面试中常见的算法题目,都不难 1 从一串有序数组中找到和为K的连续子数组。比如[1,2,2,3,5,6,7,8,9],k=5,那么答案就是[1,2,2],[2,3],[5] 思路 这个题目咋一看是没有任何思路的,只能暴力,两重for循环,这个代码贴一下 private List<List<Integer>> caTsum(int[] num, int lev)... 阅读详情

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]]

leetcode之动态规划刷题总结3 leetcode之动态规划刷题总结3 1-打家劫舍 题目链接:题目链接戳这里!!! 思路:这题思路不难,但是需要注意细节。 递推式:dp[i]=max(dp[i-1],dp[i-2]+nums[i]) class Solution { public int rob(int[] nums) { if(nums.length==1){ return nums[0] ; } if(nums.length==2){ 阅读详情

相关推荐

华为OD机试 Python【求数组组合最小和的k对元素】

首先初始化一个最小堆,将所有可能的元素对插入堆中,然后从堆中取出和最小的k对元素并计算它们的总和。通过堆的特性确保每次取出的都是当前最小的元素对,保证了结果的最小性。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值。输入两行数组array1、array2,每行首个数字为数组大小size(0 < size <= 100),0 < array1[i] <= 1000,0 < array2[i] <= 1000。

AlgorithmHero的博客 94

找出和为k的所有组合

1. 题目:给定一个数组a(a中不存在重复元素)和一个值k,求出a中元素之和为k的所有组合。比如a为{7,3,6,2},k=7,则所有组和有2+2+3和7。 2. 解析:回溯+递归。比较难以理解的是index索引的使用,代码如下: void printSum(int candidates[], int index[], int n) { for (int i = 1;...

ah7975的博客 2489

Python 轻松解决从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合。(对比用库和不用库的方法)

Python 轻松解决从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合。(对比用库和不用库的方法)

叶庭云 成为自己的光 2421

LeetCode560:和为K的数组

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subarray-sum-equals-

probie的博客 549

华为OD机试 C++【求数组组合最小和的k对元素】

首先初始化一个最小堆,将所有可能的元素对插入堆中,然后从堆中取出和最小的k对元素并计算它们的总和。通过堆的特性确保每次取出的都是当前最小的元素对,保证了结果的最小性。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值。输入两行数组array1、array2,每行首个数字为数组大小size(0 < size <= 100),0 < array1[i] <= 1000,0 < array2[i] <= 1000。

AlgorithmHero的博客 167

华为OD机试 Java【求数组组合最小和的k对元素】

首先初始化一个最小堆,将所有可能的元素对插入堆中,然后从堆中取出和最小的k对元素并计算它们的总和。通过堆的特性确保每次取出的都是当前最小的元素对,保证了结果的最小性。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值。输入两行数组array1、array2,每行首个数字为数组大小size(0 < size <= 100),0 < array1[i] <= 1000,0 < array2[i] <= 1000。

AlgorithmHero的博客 94

【字节跳动二面】在数组中随机选2个数使得和为K,输出所有的组合

题目:给一个数组(无序),在数组中随机选2个数使得和为K,输出所有的组合。 心理活动:面试时看到这个题第一想法就是给数组两个标志位,一头一尾,然后通过判定两个数的和,如果比target大,尾--,如果比target小,头++;这个想法是好的,但是如果中间出现了重复的值就会计算错误,所以要是想处理重复元素的问题一定要对次数下手,所以面试结束后重新对这个题做了一遍。 分析:首先需要将数组排序,然后...

开源世界 1340

前缀和+哈希表:解决子数组和为K的问题的黄金组合

本文旨在帮助读者深入理解前缀和与哈希表在解决子数组和问题中的应用。我们将覆盖从基础概念到高级优化的完整知识链,重点讲解如何将时间复杂度从暴力解的O(n²)优化到O(n)。核心概念解释(前缀和与哈希表)问题分析与暴力解法前缀和+哈希表的优化思路详细代码实现与解析实际应用场景与变种问题性能分析与优化技巧子数组:数组中连续的元素序列前缀和:数组中从起始位置到当前位置所有元素的和哈希表:一种通过键值对存储数据的数据结构,支持快速查找给定数组nums[0…Si0当i0∑j。

AI 算法实战派 999

输入一个有序数组,和一个数k,输出数组中所有三个数的和为k的组合

博文:http://blog.jobbole.com/11745/ 几种常见排序算法的视觉图。可以方便理解各种排序的思想,其中堆排序和希尔排序可能光看图看不明白,建议搜一下。 博文:http://blog.youkuaiyun.com/ios_long/article/details/7019718  指针和内存相关。里面有几个很典型的小例子。最近问这事的人挺多的,这帖子里写的比较清楚。 题目1:输入

345

问题描述:求从1~n的正整数中取出k(k<=n)个不重复整数的所有组合.pdf

分析:求解k个数的不同组合,我们可以用一维数组a[0]~a[k-1]来保存其中的一个结果,因为组合元 素是不重复的,可以约定其递增排列,因为数组中的元素是递增排列的: 所以a[k-1]即组合中的最后一个数,只能为k~n 令i=a[k-1] 则 i>=k && i<=n 完整代码请参考我的博客文章,这里只是核心部分

离线安装vue脚手架,内网安装@vue/cli

公司开发环境使用内网,无法用外网,搭建环境的时候,发现内网系统没有安装vue脚手架,我搜了很多文章,发现他们的方法对我都不适用,然后就自己摸索,最终皇天不负有心人,终于被我安装上了,一下是我内网离线安装vue/cli的方法,希望能帮助到有需要的小伙伴! 因为npm被集成在nodejs中,而安装nodejs只需要把nodejs安装包copy到内网电脑安装就行,比较简单,这里就不多做演示。 在外网电脑上,使用npm install -g xxxx命令下载好我们所需要的各个安装包,比如: npm insta

Liberty_yes的博客 1万+

LeetCode-Python-560. 和为K的子数组

给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] ,且整数k的范围是[-1e7, 1e7]。 思路: 问连续子数组的题...

Keep Coding 2217

FreeRTOS实战:如何避免HAL_Delay在高优先级中断中的坑(附TIM6配置指南)

本文深入剖析了在STM32 FreeRTOS项目中,于高优先级中断内调用HAL_Delay函数导致系统假死的根本原因——SysTick时基被FreeRTOS占用且优先级最低。文章提供了治本方案:通过配置TIM6作为独立且最高优先级的HAL时基,实现与FreeRTOS系统心跳的解耦,并附上详细的CubeMX配置与代码移植指南,确保系统实时性与稳定性。

weixin_29230059的博客 64

算法刷题总结——和为K问题

前缀和+哈希表,这里的关键在于,如果你想要找到一个和为 k 的子数组,你可以通过以下方式思考:假设你已经计算了从数组开始到当前位置 i 的前缀和 pre_sum。如果存在一个之前的前缀和 prev_sum,使得 pre_sum - prev_sum = k,那么从 prev_sum 到 pre_sum 的子数组的和就是 k。

m0_69064462的博客 360

迭代牛顿-欧拉法——机器人动力学逆解

迭代牛顿-欧拉法牛顿欧拉法的步骤向外回归(outward recursion)step 1step 2向内回归(inward recursion)step 3step 4牛顿欧拉法的三种形式无坐标系NE算法(Coordinate-Free Algorithm)连杆坐标系NE算法(Link-Coordinates Algorithm)3-D向量NE算法 牛顿欧拉法的步骤 牛顿欧拉法(NE)是求解机器人动力学逆解的一种方法。动力学逆解定义为:已知机器人的构型qqq和运动的速度q˙\dot{q}q˙​和加速度q¨

qq_41845878的博客 4096

Vitis开发环境下的双核ARM通信:Hello World背后的AMP架构解析

本文深入解析了Vitis开发环境下ZYNQ双核ARM Cortex-A9处理器的AMP架构与通信机制。通过详细的硬件配置、内存分配和核间通信实现步骤,展示了如何构建高效的双核Hello World系统,为嵌入式系统开发者提供了实用的开发指南和性能优化技巧。

weixin_29162439的博客 218
上一篇: 形变分析模型
下一篇: 最长公共子串与最长公共子序列
MusicDancing
博客等级 码龄7年 2684粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值