算法笔记-lc-698. 划分为k个相等的子集(难度中等)

用Arduino与红外传感器自制简易泰勒明琴:电子音乐创客实践 传感器技术是物联网与智能交互的核心基础,其通过感知物理量变化并将其转换为电信号实现环境感知。在电子音乐与创意交互领域,传感器常被用于将肢体动作等模拟信号映射为数字控制信号,从而实现新颖的人机交互方式。本项目基于这一原理,利用红外测距传感器捕捉手部距离变化,通过Arduino微控制器进行信号处理与映射,最终驱动无源蜂鸣器生成对应频率的声音,完整实现了从信号感知到声音合成的技术链路。其技术价值在于以低成本、易获取的创客组件(如Arduino和红外传感器)复现了经典电子乐器泰勒明琴(Theremin)的无接触演奏 阅读详情

题目

题干

给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

难度中等

示例

示例 1:

输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
示例 2:

输入: nums = [1,2,3,4], k = 3
输出: false

提示

提示:

1 <= k <= len(nums) <= 16
0 < nums[i] < 10000
每个元素的频率在 [1,4] 范围内

题解

方法1:状态压缩 + 记忆化搜索

思路与算法

题目给定长度为 n 的数组 nums,和整数 k,我们需要判断是否能将数组分成 k 个总和相等的非空子集。首先计算数组的和 all,如果 \textit{all}all 不是 k 的倍数,那么不可能能有合法方案,此时直接返回 False。否则我们需要得到 k 个和为 per= all/k的集合,那么我们每次尝试选择一个还在数组中的数,若选择后当前已选数字和等于 per 则说明得到了一个集合,而已选数字和大于per 时,不可能形成一个集合从而停止继续往下选择新的数字。又因为 n 满足1≤n≤16,所以我们可以用一个整数 S 来表示当前可用的数字集合:从低位到高位,第 i位为 1 则表示数字 nums[i] 可以使用,否则表示nums[i] 已被使用。为了避免相同状态的重复计算,我们用 dp[S] 来表示在可用的数字状态为 S 的情况下是否可行,初始全部状态为记录为可行状态 True。这样我们就可以通过记忆化搜索这种「自顶向下」的方式来进行求解原始状态的可行性,而当状态集合中不存在任何数字时,即 S=0 时,表示原始数组可以按照题目要求来进行分配,此时返回True 即可。

代码

class Solution {
    int[] nums;
    int per, n;
    boolean[] dp;

    public boolean canPartitionKSubsets(int[] nums, int k) {
        this.nums = nums;
        int all = Arrays.stream(nums).sum();
        if (all % k != 0) {
            return false;
        }
        per = all / k;
        Arrays.sort(nums);
        n = nums.length;
        if (nums[n - 1] > per) {
            return false;
        }
        dp = new boolean[1 << n];
        Arrays.fill(dp, true);
        return dfs((1 << n) - 1, 0);
    }

    public boolean dfs(int s, int p) {
        if (s == 0) {
            return true;
        }
        if (!dp[s]) {
            return dp[s];
        }
        dp[s] = false;
        for (int i = 0; i < n; i++) {
            if (nums[i] + p > per) {
                break;
            }
            if (((s >> i) & 1) != 0) {
                if (dfs(s ^ (1 << i), (p + nums[i]) % per)) {
                    return true;
                }
            }
        }
        return false;
    }
}

复杂度分析

时间复杂度O(n×2n),其中 nn 为数组 nums 的长度,共有 2n个状态,每一个状态进行了 n 次尝试。
空间复杂度:O(2^n),其中 n 为数组 nums 的长度,主要为状态数组的空间开销。

方法二:状态压缩 + 动态规划

思路与算法

我们同样可以用「动态规划」这种「自底向上」的方法来求解是否存在可行方案:同样我们用一个整数 S 来表示当前可用的数字集合:从低位到高位,第 i 位为 0 则表示数字 nums[i] 可以使用,否则表示 nums[i] 已被使用。然后我们用dp[S] 来表示在可用的数字状态为 S 的情况下是否可能可行,初始全部状态为记录为不可行状态 ,只记 dp[0]=True 为可行状态。同样我们每次对于当前状态下从可用的数字中选择一个数字,若此时选择全部数字取模后小于等于per。则说明选择该数字后的状态再继续往下添加数字是可能能满足题意的,并且此时标记状为可能可行状态,否则就一定不能达到满足。最终 dp[U] 即可,其中 U 表示全部数字使用的集合状态。

代码

class Solution {
    public boolean canPartitionKSubsets(int[] nums, int k) {
        int all = Arrays.stream(nums).sum();
        if (all % k != 0) {
            return false;
        }
        int per = all / k;
        Arrays.sort(nums);
        int n = nums.length;
        if (nums[n - 1] > per) {
            return false;
        }
        boolean[] dp = new boolean[1 << n];
        int[] curSum = new int[1 << n];
        dp[0] = true;
        for (int i = 0; i < 1 << n; i++) {
            if (!dp[i]) {
                continue;
            }
            for (int j = 0; j < n; j++) {
                if (curSum[i] + nums[j] > per) {
                    break;
                }
                if (((i >> j) & 1) == 0) {
                    int next = i | (1 << j);
                    if (!dp[next]) {
                        curSum[next] = (curSum[i] + nums[j]) % per;
                        dp[next] = true;
                    }
                }
            }
        }
        return dp[(1 << n) - 1];
    }
}

复杂度分析

时间复杂度:O(n×2 n),其中 nn 为数组nums 的长度,共有 2^n个状态,每一个状态进行了 n 次尝试。
空间复杂度:O(2^n),其中 n 为数组nums 的长度,主要为状态数组的空间开销。

划分为k个相等的子集 划分为k个相等的子集,回溯算法 阅读详情

相关推荐

【信息科学与工程学】【物理/化学科学和工程技术】知识体系081 磁学——系列二 电磁学——电磁学理论模型01

编号模型名称核心数学描述关键参数与物理意义应用场景与说明EM1.001​麦克斯韦微分方程组∇·D=ρ, ∇·B=0, ∇×E=-∂B/∂t, ∇×H=J+∂D/∂tD-电通密度(C/m²), B-磁通密度(T), E-电场强度(V/m), H-磁场强度(A/m)所有电磁现象的基本控制方程,集成电路电磁分析基础EM1.002​麦克斯韦积分方程组∮S D·dS=Q, ∮S B·dS=0, ∮C E·dl=-dΦ_B/dt, ∮C H·dl=I+dΦ_D/dtQ-电荷(C), Φ_B-磁通(Wb), I-电流(A

weixin_49199313的博客 1171

leetcode:698. 划分为k个相等的子集

对于本题,我们先给出一个样例:nums = [1, 2, 2, 4, 3, 3], k = 3,和题目中的样例不同,下面的所有分析都围绕这个样例展开。(3)最后可以优化的第三个点,对于第一个球,任意放到某个桶中的效果都是一样的,所以我们规定放到第一个桶中。我们先结合下面的决策树,根据[排列]问题来详细分析下如何理解[路径]和[选择列表]为了可以更好的理解「回溯」的思想,我们这里提供两种不同的视角进行分析对比。经过上面的分析,我们很明显的知道[结束条件],即:所有数都被选择。

OceanStar的博客 453

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02

编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2.

weixin_49199313的博客 316

【698. 划分为k个相等的子集】

否则我们需要得到 k 个和为 per = all / k 的集合,那么我们每次尝试选择一个还在数组中的数,若选择后当前已选数字和等于 per 则说明得到了一个集合,而已选数字和大于 per 时,不可能形成一个集合从而停止继续往下选择新的数字。然后我们用 dp[S] 来表示在可用的数字状态为 S 的情况下是否可能可行,初始全部状态为记录为不可行状态 False,只记 dp[0] = True 为可行状态。),其中 n 为数组 nums 的长度,主要为状态数组的空间开销。时间复杂度:O(n×2。

Sugar_wolf的博客 636

【信息科学与工程学】【通信工程】第七十九篇 网络规划中的方案中的数学建模01

编号学科网络领域产品核心知识点与数学方程式在网络设计中的详细作用理论/工程依据 关联知识和法律法规1概率论与数理统计​流量工程与负载均衡​路由器、交换机、SDN控制器核心知识点:​ 排队论 方程式:​ M/M/1队列平均等待时间 W=μ(μ−λ)λ​ 变量定义:​ λ = 平均到达率 (packets/s), μ = 平均服务率 (packets/s) 单位:​ packets/s, s 数值设计:​ 需满足 ρ=λ/μ<1 以保证队列稳定。 推导要点:​ 基于泊松到达过程与指

weixin_49199313的博客 328

【信息科学与工程学】【安全领域】安全基础——第十五篇 网安协同方案02-L1层面协同

​度量系统总“拥堵”或不稳定程度定义为所有队列(包括实际和虚拟队列)长度的二次函数。函数值大,系统不稳定。

weixin_49199313的博客 802

LeetCode698:划分为k个相等的子集(递归)

LeetCode698:划分为k个相等的子集(递归) 1、给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 方法一:递归: 思路: 对于每个数来讲,其都有k个选择(就是k个桶),每个数都需要尝试放在第i(i>=0&&i<K)个桶里。只要当前尝试的第i个桶正好能放下当前的数或者放下当前的数后桶里的容量还有剩余,那么这个数就可以放在这个桶里,那么我们就可以进行对下一个数选择可以放入的桶了。 在进行递归函数之前,就进行了预处

cui1004的博客 540

【信息科学与工程学】【通信工程】第二百四十篇 IPv4/IPv6 功能点、特性和算法及 IPv4→IPv6 迁移特性02

说明:按「纯数学 → 数学物理 → 多物理场 → 界面/表面科学耦合 + 数学化学 + 运动科学(0.01 nm → μm → mm → cm 精度及超长运动)」纵向穿透,每一行给出,最后挂。

weixin_49199313的博客 513

Leetcode——划分为k个相等的子集(目标和)

1. 划分为k个相等的子集 (1)回溯,剪枝,贪心 将数组划分为k个组,使得每个组的和均相等。 求出数组总和sum,如果sum除以k不为整数,肯定就不满足每个组的和相等,直接return false. 拿到sum/k的值target后,target就代表每个组的和需要达到的值(超过或不足都不行) 同时,如果数组的最大值>target也无法满足题意,return false. 剪枝: 找到k-1个满足题意的组合后,就可以return true了。因为剩下未选的元素的和肯定为数组总和sum-(k-

Yawn 1290

【信息科学与工程学】信息科学领域——第一百三十五篇 射频/天线07

业务—财务—资金—流程—时序—模式—金融—资源"复合数学模型编号类型行业企业类型及商业模式画布企业性质领域问题问题的业务‑财务‑资金‑流程‑时序‑模式‑金融‑资源数学模型参数列表(符号 / 数学表达式 / 数值范围 / 边界 / 测量方法)关联知识、监督监管机构、法律法规、党纪党章、政治M1矿产探采一体煤炭 / 金属矿 / 非金属矿探采一体化集团(关键业务:勘探→采矿→选冶→销售;核心资源:采矿权、储量;收入来源:矿产品销售;成本:CAPEX、OPEX、权益金、资源税、恢复基金;客户:电厂/钢厂/化工厂)中

weixin_49199313的博客 340

基于AXI PCIE IP的FPGA PCIE卡示意图

如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。

csdn_gddf102384398的博客 1624

【LeetCode】升级打怪之路 Day 26:回溯算法 — 集合划分问题

Day 26:回溯算法 —— 集合划分问题

VLyb 1350

EtherCAT简介

EtherCAT(EtherNet Control Automation Technology)是由德国公司BECKHOFF公司于2003年提出的实时工业以太网技术。其具有高速、高数据有效率的特点,支持多种设备的连接拓扑结构。从站节点使用专用的控制芯片,例如:microchip公司的Lan9252、BECKHOFF公司的ET1100等ESC(EtherCAT slave controller)芯片。主站的搭建方式有很多,例如:开源主站IGH、SOEM、商业化主站TwinCAT等。

m0_73482095的博客 1万+

LC-698. 划分为k个相等的子集(回溯)

难度中等869给定一个整数数组 和一个正整数 ,找出是否有可能把这个数组分成 个非空子集,其总和都相等。示例 1: 示例 2: 提示:

qq_42958831的博客 167

手把手教你复现IEEE 2025高光谱图像盲超分算法DBSR(附开源代码与避坑指南)

本文详细介绍了如何从零复现IEEE 2025高光谱图像盲超分算法DBSR,包括环境配置、数据预处理、核心模块解析、训练策略及常见问题解决方案。特别针对开源代码中的关键步骤和潜在问题提供了实用指南,帮助研究者和开发者高效实现Deep blind super-resolution技术,适用于遥感、医疗等领域的图像增强应用。

weixin_42524708的博客 413

AMD MI50 Linux ROCm 6.4 手动编译与大模型推理实战

GPU加速计算是现代AI推理的核心基础,其性能依赖于硬件架构、驱动栈与运行时环境的深度协同。ROCm作为AMD开源GPU计算平台,采用‘自下而上’的Linux生态集成路径,强调对上游内核、编译器与固件的强耦合。MI50基于Vega 20(gfx900)架构,虽具备32GB HBM2高带宽显存与14.7 TFLOPS FP16算力,但因ROCm官方支持策略转向CDNA架构,自6.5版本起被移出支持列表,仅ROCm 6.4仍提供实验性兼容——这使其成为Linux下部署私有大模型的关键‘最后一班船’。本文围绕MI

weixin_32770423的博客 370

面试大厂leetcode重点题型简洁明快复习(dfs/bfs,动态规划,链表,滑动窗口/双指针,回溯,ACM型输入输出,二分)

笔者正在应聘大厂的春招岗位,笔者筛选了一下经常遇到的面试题型重点dfs/bfs动态规划链表滑动窗口/双指针回溯ACM型输入输出二分),笔者这里也尽量挑里面的最重点题型,从问题入手,对这些题型进行简洁明快的复习,其他的一些数据结构的题,也考,但笔者认为不是重点,这里就不提了。

weixin_44151034的博客 587

MATLAB 控制 E4438C 信号源的研究

通过 MATLAB,我们可以实现对 E4438C 的远程控制,从而实现更高的自动化和可编程性。总结起来,通过使用 MATLAB 和 Instrument Control Toolbox,我们可以轻松地控制 E4438C 信号源并生成各种类型的信号。需要注意的是,以上代码仅为示例,实际应用中可能需要根据具体情况进行更详细的配置和错误处理。此外,MATLAB 还提供了一系列函数和命令,可用于控制 E4438C 信号源的其他功能,如频率调谐、功率设置、调制设置等。您可以根据自己的需求进行相应的配置和控制。

RswtPerl的博客 1014

2021-03-05 划分为k个相等的子集

题目 划分为k个相等的子集 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 输出: True 说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。 class Solution { public: bool canPartitionKSubsets(vector<int>& nums, int

weixin_45018528的博客 473

泛微OA集成阿里云短信(E9保姆教程)

泛微OA集成阿里云短信(E9保姆教程)

技术分享 515

爬取B站评论+AI情感分析:Python批量抓数据+BERT正负向分类(全流程)

B站作为年轻群体聚集的内容平台,评论区蕴含海量用户真实态度(如好评、吐槽、中立观点),是情感分析的优质数据源!本文分享完整流程:批量爬取B站视频评论→数据清洗去噪→BERT模型情感分类→可视化分析,基于预训练BERT模型实现高精度正负向判断,新手也能快速复刻情感分析系统! 前置配置(关键!获取B站API访问权限) B站评论通过官方API接口返回,无需复杂解析,只需配置用户Cookie即可正常请求: 2. 完整代码(直接复制运行) 三、使用步骤(5步搞定,新手友好) 步骤1:配置关键参数 打开,在类中修改

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1069

Leetcode 698. 划分为k个相等的子集

Leetcode 698. 划分为k个相等的子集

weixin_44852067的博客 668

基于STM32的家庭环境监测毕业设计(全部资料)

本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。

3254968421的博客 462

LeetCode-698. 划分为k个相等的子集【数组,回溯】

public :// 从大到小放数字 sort(nums . rbegin() , nums . rend());// 记录每个子集中数字之和 bucket . resize(k);// 每个桶中的数字之和应该为target int target = sum / k;// index = 0, 表示从0号元素开始遍历 return backtrack(nums , 0 , target);// 记录每个子集中数字之和 vector < int > bucket;

zik的博客 544

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

leetcode698.划分为k个相等的子集

题目大意 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 输出: True 说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。 提示: 1 <= k <= len(nums) <= 16 0 < nums[i] < 10000 解题思路 先判断能否被K整除。然后判断商是否大于数组最大

大腿壮的博客 320

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

698. 划分为k个相等的子集

算法题(程序员面试宝典) 解题思路主要来源于leetcode官方与《程序员面试宝典》&labuladong 698. 划分为k个相等的子集 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 输出: True 说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。 提示: 1 <= k <= len(nums

weixin_40764894的博客 322

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: kafka原理简介
下一篇: 服务器三种常见的限流算法
Hell_potato777
博客等级 码龄6年 48粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值