持续创作,加速成长!这是我参与「掘金日新计划 · 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
}
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~