递归(3)----力扣40组合数2,力扣473火柴拼正方形

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。 

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

 

from typing import List

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        def backtrack(start: int, target: int, current: List[int]):
            if target == 0:
                result.append(current[:])
                return
            
            for i in range(start, len(candidates)):
                # 剪枝:如果当前数字大于目标值,后面的数字更大,直接跳出
                if candidates[i] > target:
                    break
                
                # 跳过重复数字,确保不会生成重复组合
                if i > start and candidates[i] == candidates[i-1]:
                    continue
                
                # 选择当前数字
                current.append(candidates[i])
                # 递归寻找剩余目标值的组合,注意是i+1因为每个数字只能用一次
                backtrack(i + 1, target - candidates[i], current)
                # 回溯,移除当前数字
                current.pop()
        
        # 先排序,便于处理重复元素
        candidates.sort()
        result = []
        backtrack(0, target, [])
        return result

if __name__ == '__main__':
    s = Solution()
    print(s.combinationSum2([10,1,2,7,6,1,5], 8))
    print(s.combinationSum2([2,5,2,1,2], 5))

例子
假设我们有一个候选数字列表 candidates = [1, 2, 3],我们想要找到所有组合,使得它们的和等于 target = 4。
递归过程
初始调用:
backtrack(0, 4, []):从索引 0 开始,目标值为 4,当前组合为空。
2. 第一层递归:
选择 candidates[0] = 1:
current = [1],目标变为 4 - 1 = 3,调用 backtrack(1, 3, [1])。
选择 candidates[1] = 2:
current = [2],目标变为 4 - 2 = 2,调用 backtrack(2, 2, [2])。
选择 candidates[2] = 3:
current = [3],目标变为 4 - 3 = 1,调用 backtrack(3, 1, [3])。
3. 第二层递归:
对于 current = [1],目标为 3:
选择 candidates[1] = 2:
current = [1, 2],目标变为 3 - 2 = 1,调用 backtrack(2, 1, [1, 2])。
选择 candidates[2] = 3:
current = [1, 3],目标变为 3 - 3 = 0,找到一个有效组合 [1, 3],返回。
4. 继续探索:
对于 current = [2],目标为 2:
选择 candidates[2] = 3,目标变为 2 - 3 = -1,无效,返回。
对于 current = [1, 2],目标为 1:
选择 candidates[2] = 3,目标变为 1 - 3 = -2,无效,返回。
5. 最终结果:
通过递归的方式,我们会找到所有有效的组合,最终结果为 [[1, 3], [2, 2]]。
总结
这个例子展示了如何通过递归探索所有可能的组合,直到找到所有和为目标值的组合。每次选择一个数字并递归调用,直到满足条件或超出目标值。

你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。

如果你能使这个正方形,则返回 true ,否则返回 false 。

示例 1:

输入: matchsticks = [1,1,2,2,2]
输出: true
解释: 能拼成一个边长为2的正方形,每边两根火柴。

示例 2:

输入: matchsticks = [3,3,3,3,4]
输出: false
解释: 不能用所有火柴拼成一个正方形。

from typing import List  # 导入 List 类型

class Solution:
    def makesquare(self, matchsticks: List[int]) -> bool:
        total_length = sum(matchsticks)  # 计算所有火柴棒的总长度
        
        # 如果总长度不能被4整除,无法形成正方形
        if total_length % 4 != 0:
            return False  # 返回 False
        
        side_length = total_length // 4  # 计算每个边的目标长度
        matchsticks.sort(reverse=True)  # 从大到小排序,优化回溯过程
        sides = [0] * 4  # 初始化四个边的当前长度为0

        def backtrack(index: int) -> bool:
            if index == len(matchsticks):  # 如果所有火柴棒都已使用
                # 检查四个边是否相等
                return all(side == side_length for side in sides)  # 返回是否每个边都等于目标边长
            
            for i in range(4):  # 遍历四个边
                if sides[i] + matchsticks[index] <= side_length:  # 如果当前边加上火柴棒不超过目标边长
                    sides[i] += matchsticks[index]  # 选择当前火柴棒,加入到当前边
                    if backtrack(index + 1):  # 递归处理下一个火柴棒
                        return True  # 如果成功,返回 True
                    sides[i] -= matchsticks[index]  # 回溯,撤销选择
            
            return False  # 如果无法拼成正方形,返回 False
        
        return backtrack(0)  # 从第一个火柴棒开始回溯

if __name__ == '__main__':
    s = Solution()  # 创建 Solution 类的实例
    print(s.makesquare([1, 1, 2, 2, 2]))  # 输出: True,能拼成正方形
    print(s.makesquare([3, 3, 3, 3, 4]))  # 输出: False,不能拼成正方形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot Data Redis连接Redis-Cluster集群

使用SpringBoot Data Redis无法连接Redis-Cluster集群 最近在研究系统高并发下的缓存架构&#xff0c;因此自己在自己买的云服务器上搭建好Redis 5.0 版本的集群后&#xff0c;使用springboot的 RedisTemplate连接是发现总是访问不到集群节点。上网百度了发现没有好的解决办法&…

【插件】重复执行 pytest-repeat

安装 pip3 install pytest-repeat 用法 1.命令行 pytest --count num pytest --count 32.装饰器 pytest.mark.repeat(num) #num运行次数 pytest.mark.repeat(5)#执行结果如下&#xff1a;

强制放大缩小(适用于所有ctrl-,ctrl+)

以下操作&#xff1a; 使用资源管理器打开启动文件夹&#xff1a; 按下 Win R 键打开“运行”对话框。输入 shell:startup&#xff0c;然后按下 Enter。这应该会打开启动文件夹。 手动定位启动文件夹&#xff1a; 打开资源管理器并导航到以下路径&#xff1a; C:\Users\admin…

web前端开发网页--css样式的使用

1、css层叠性 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css层叠性</title><style type"text/css">p{font-size: 12px;font-family: "微软雅黑";}.special{font-size: 24px;}#one{c…

idea 通过git撤销commit但未push的操作

1、undo commit 适用情况&#xff1a;代码修改完了&#xff0c;已经Commit了&#xff0c;但是还未push&#xff0c;然后发现还有地方需要修改不想提交本次记录了。这时可以进行Undo Commit&#xff0c;修改后再重新Commit。注意&#xff1a;如果已经进行了Push&#xff0c;线上…

『VUE』30. 生命周期的介绍(详细图文注释)

目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xf…

远程jupyter lab的配置

打开虚拟环境 conda activate test 在环境下安装ipykernel软件包&#xff0c;这个软件包允许jupyter notebookl使用特定环境的python版本。 conda install ipykernel 将该环境添加到Jupyter Notebook中 python -m ipykernel install --user --nametest --display-name&quo…

C指针之舞——指针探秘之旅

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏内容&#xff1a;C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中&#xff0c;简单总结了指针的基础概念 我们知道了指针的概念&#xf…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

Spring Cloud微服务下如何配置I8n

什么是I8n 国际化&#xff08;I18n&#xff09;指的是设计和开发产品的过程&#xff0c;使得它们能够适应多种语言和文化环境&#xff0c;而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品&#xff0c;然后通过配置和资源文件来添加对不同语言和地区的支持。 这…

将分割标签数据从JSON格式转换为YOLOv8的TXT格式

AnyLabeling是一款突破性的开源图像标注工具。 一、主要功能与特点 融合传统标注工具优点&#xff1a;AnyLabeling结合了LabelImg和Labelme等传统标注软件的优点&#xff0c;提供了多边形、矩形、圆形、线条和点等多种标注形式&#xff0c;满足不同场景的需求。强大的AI自动标…

【graphics】图形绘制 C++

众所周知&#xff0c;周知所众&#xff0c;图形绘制对于竞赛学僧毫无用处&#xff0c;所以这个文章&#xff0c;专门对相关人员教学&#xff08;成长中的码农、高中僧、大学僧&#xff09;。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…

Javaweb梳理17——HTMLCSS简介

Javaweb梳理17——HTML&CSS简介 17 HTML&CSS简介17.1 HTML介绍17.2 快速入门17.3 基础标签17.3 .1 标题标签17.3.2 hr标签17.3.3 字体标签17.3.4 换行17.3.8 案例17.3.9 图片、音频、视频标签17.3.10 超链接标签17.3.11 列表标签17.3.12 表格标签17.3.11 布局标签17.3.…

637. 二叉树的层平均值【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 637. 二叉树的层平均值 一、题目描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 二、测试用例 示例 1&a…

selenium元素定位---元素点击交互异常解决方法

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、异常原因 在编写ui自动化时&#xff0c;执行报错元素无法点击&#xff1a;ElementClickInterceptedException 具体报错&#xff1a;selenium.common.exc…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

搭建MC服务器

局域网中玩MC&#xff0c;直接自己创建房间开启局域网就可以了。如果想开一个24小时不关机的服务器呢&#xff1f;其实最开始我是想在windows云服务器&#xff0c;图形化界面运行一个开启局域网即可。可能是云服务器上没有显卡&#xff0c;还是其他什么原因&#xff0c;游戏打开…

数据结构-二叉搜索树(Java语言)

目录 1.概念 2.查找search 3.插入insert ​编辑4.删除remove&#xff08;难点&#xff09; 5.性能分析 1.概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树 : 1.若它的左子树不为空&#xff0c;则左子树上所有节点的值都…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

【Pikachu】PHP反序列化RCE实战

痛是你活着的证明 1.PHP反序列化概述 在理解 PHP 中 serialize() 和 unserialize() 这两个函数的工作原理之前&#xff0c;我们需要先了解它们各自的功能及其潜在的安全隐患。接下来&#xff0c;我会对相关概念做更详细的扩展解释。 1. 序列化 serialize() 序列化&#xff…