【我也想刷穿 LeetCode啊】473. 火柴拼正方形

82 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

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

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

 

示例 1:

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

示例 2:

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

提示:

1 <= matchsticks.length <= 15 1 <= matchsticks[i] <= 108

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ma… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

写题前先根据常识判断一下是否满足正方形的要素

总的火柴棍够不够四条

加起来能不能被四整除

会不会有比边大的火柴棍(当然这个放到dfs里面判断去了)

就像做三角形的题目,先给边排序一下,按照从大到小排列,在找到边的长度作为目标值

再建立一个储存当前边的数组edges = 0,0,0,0

然后就可以写主体的DFS部分了

三、代码实现

const dfs = (i) => {
    //结束判断,当最后一条边(i-1)也能被放入正方形中
    if(i === nums.length)return true
    for(let k = 0;k<4;k++){
        //能否成行的条件判断,因为排过序了,所以如果当前边加起来大于目标边,直接加入下一个边
        //这里可作为要素3的判断
        //如果当前边等于上一条边了可以直接跳过,这样可以确定四条边的一致性
      if(edges[k] + nums[i] > SIDE || (k&&edges[k]===edges[k-1]))continue
      edges[k] += nums[i] 
        //进行下一条火柴棍的判断
      if(dfs(i+1))return true
        //回溯
      edges[k] -= nums[i]
    }
    return false
  }

四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~