火柴拼正方形

简介: 🎈每天进行一道算法题目练习,今天的题目是“火柴拼正方形”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“火柴拼正方形”。

问题描述

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

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

示例 1:

image.png

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

示例 2:

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

提示:

1 <= matchsticks.length <= 15
1 <= matchsticks[i] <= 10^8

思路分析

阅读完题目之后,我们知道了题目是要我们使用给出的若干根火柴拼接成一个正方形,拼接过程中有以下限制:

  • 1、不能折断 任何一根火柴棒;
  • 2、 每根火柴棒必须 使用一次

也就是说我们需要将所有火柴都用上,拼接连成一个正方形。\
知道了题目要求之后我们便可以开始思考该如何用代码实现,首先大家都知道正方形有以下两个的性质:

  • 1、由四条边组成;
  • 2、四条边的边长都相等

我们可以利用这两个性质来完成这道题目:

  • 1、排除没有四条边或者边长不相等的情况

我们可以优先排除掉不能组成正方形的情况:

const sum = matchsticks.reduce((a,b) =>{return a + b;});
if (matchsticks.length < 4 && sum % 4) return false;
  • 2、使用火柴填充四条边,判断是否可以刚好填充
将每根火柴尝试放入每一条边。
我们可以使用深搜回溯的方法来进行求解,每次遍历四条边,判断当前火柴可以放入哪一条边,如果四条边都不满足,无法放入火柴的话,则说明这组火柴不能组成火柴正方形。找到可以放入的边时,则递归判断下一根火柴,遇到不满足的情况时则回溯,具体代码如下:
function backtrack(i, bucket) {
    if (i >= matchsticks.length) return true;
    for (let j = 0; j < bucket.length; j++) {
        if (bucket[j] + matchsticks[i] > side) continue;
        bucket[j] += matchsticks[i];
        if (backtrack(i + 1, bucket)) return true;
        bucket[j] -= matchsticks[i];
    }
    return false;
}

AC代码

/**
 * @param {number[]} matchsticks
 * @return {boolean}
 */
var makesquare = function (matchsticks) {
    function backtrack(i, bucket) {
        if (i >= matchsticks.length) return true;
        for (let j = 0; j < bucket.length; j++) {
            if (bucket[j] + matchsticks[i] > side) continue;
            bucket[j] += matchsticks[i];
            if (backtrack(i + 1, bucket)) return true;
            bucket[j] -= matchsticks[i];
        }
        return false;
    }
    const sum = matchsticks.reduce((a,b) =>{return a + b;});
    const side = sum / 4;
    if (matchsticks.length < 4 && sum % 4) return false;
    matchsticks = matchsticks.sort((a, b) => b - a);
    const bucket = Array(4).fill(0);
    return backtrack(0, bucket);
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
安全 Java easyexcel
【二十七】springboot实现多线程事务处理
【二十七】springboot实现多线程事务处理
837 0
企业微信接入系列-上传临时素材
简述在API接口创建企业群发时上传临时素材的操作
企业微信接入系列-上传临时素材
|
算法 内存技术
语音信号的A律压缩和u律压缩matlab仿真
语音信号的A律压缩和u律压缩matlab仿真
|
4月前
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。
|
2月前
|
机器学习/深度学习 测试技术
先SFT后RL但是效果不佳?你可能没用好“离线专家数据”!
通义实验室Trinity-RFT团队提出CHORD框架,通过动态融合SFT与RL,解决大模型训练中“越学越差”“顾此失彼”等问题。该框架引入细粒度Token级权重与软过渡机制,实现从模仿到超越的高效学习,在数学推理与通用任务上均显著提升性能,相关代码已开源。
333 0
|
存储 移动开发 负载均衡
晨兴夜寐:这一次,彻底搞懂Cookie,LocalStorage,SessionStorage
晨兴夜寐:这一次,彻底搞懂Cookie,LocalStorage,SessionStorage
1858 0
|
9月前
|
存储 人工智能 前端开发
用arkts写鸿蒙app:简单的海报生成
本文介绍了基于鸿蒙系统开发的一款个人字典与创作辅助应用,重点实现海报生成功能。通过Canvas画布组件完成图片绘制、文字填充等操作,并利用鸿蒙的沙盒机制和权限管理将生成的海报保存至本地。文中详细展示了代码实现步骤,包括渲染逻辑、数据导出及文件存储过程,同时提供了相关API文档链接以便参考。此项目不仅满足了作者个人兴趣需求,还体现了鸿蒙系统的独特特性和开发潜力。
412 4
|
JSON 安全 JavaScript
JSONP 有什么缺点
JSONP(JSON with Padding)是一种跨域数据交互协议,但它存在一些缺点:安全性较低,容易受到XSS攻击;只能使用GET请求,不支持其他HTTP方法;无法处理错误,请求失败时难以调试。
|
TensorFlow 算法框架/工具 iOS开发
【Python-Tensorflow】ERROR: Could not find a version that satisfies the requirement tensorflow
本文讨论了在安装TensorFlow时遇到的版本兼容性问题,并提供了根据Python版本选择正确pip版本进行安装的解决方法。
1821 1
|
关系型数据库 MySQL Linux
【MySQL】如何在Linux上安装MySQL
【MySQL】如何在Linux上安装MySQL
291 1