首页 > 其他分享 >LeetCode 473 火柴拼正方形

LeetCode 473 火柴拼正方形

时间:2023-05-08 11:55:33浏览次数:37  
标签:used return 正方形 int matchsticks 473 火柴 LeetCode

LeetCode | 473.火柴拼正方形

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

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

示例 1:
img
输入: 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 461.分割等和子集, 分割等和子集是分成两等份,这道题是分成 4 等分。

  k 表示当前在计算第几条边,used 表示被用过的火柴(总数小于32,可以用int 的二进制表示)。每条边都从 0 开始重新计算,可能会有一些重复计算,用 mp 记录计算过的组合。

int edge;
unordered_map<int, int> mp;
bool makesquare(vector<int>& matchsticks) {
    int sum = accumulate(matchsticks.begin(), matchsticks.end(), 0);
    if (sum % 4)
        return false;
    edge = sum / 4;
    return helper(matchsticks, 4, 0, 0, 0);
}

bool helper(vector<int>& matchsticks, int k, int cursum, int used, int i) {
    if (k == 1)
        return true;
    if (i >= matchsticks.size())
        return false;
    if (mp.count(used))
        return mp[used];
    if (cursum == edge) 
        return mp[used] = helper(matchsticks, k - 1, 0, used, 0);
    for (int j = i; j < matchsticks.size(); ++j) {
        if (!(used & (1 << j)) && matchsticks[j] + cursum <= edge &&
            helper(matchsticks, k, matchsticks[j] + cursum, used | (1 << j), j + 1)){
            return mp[used] = 1;
        }
    }
    return mp[used] = 0;
}

标签:used,return,正方形,int,matchsticks,473,火柴,LeetCode
From: https://www.cnblogs.com/AngleLin/p/17381299.html

相关文章

  • LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手。往期周赛回顾:LeetCode单周赛第343场·结合「下一个排列」的贪心构造问题周赛概览T1.找出不......
  • LeetCode 15. 三数之和
    题目链接:LeetCode15.三数之和题意:在给定的数组中,找出三个数(三个数不重复)使得他们相加的和为0,同时答案中不能有重复的答案解题思路:完整代码如下://双指针做法首先要有序//解法一最优解,双指针+排序functhreeSum(nums[]int)[][]int{varres[][]intsor......
  • LeetCode 18. 四数之和
    题目链接:LeetCode18.四数之和题意:本题思路与LeetCode15.三数之和思路完全一样,只是多加了一层for循环解题思路:完整代码如下:funcfourSum(nums[]int,targetint)[][]int{//四元组,四个元素都不相同,并且结果要去重varres[][]intsort.Ints(nums)......
  • LeetCode 383. 赎金信
    题目链接:LeetCode383.赎金信题意:给你两个字符串:ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。解题思路:首先利用map记录magazine中所有出现的字母,key是单个字母,value是该字母出现的次数,然后遍历ransomNote,检查当前字母在magazine中是......
  • LeetCode 516. 最长回文子序列
    classSolution{public:intf[1010][1010];//f[i][j]表示s[i~j]之间的最长序列intINF=0x3f3f3f3f;intlongestPalindromeSubseq(strings){intn=s.size();s=''+s;for(intlen=1;len<=n;len++)for(inti=1;i......
  • LeetCode 202. 快乐数
    题目链接:LeetCode202.快乐数题意:本题是让我们判断一个数是否是快乐数,题干中给出了快乐数的条件。解题思路:方法一:在题干中指出,如果一个数不是快乐数的话,那么它的各个位上的数字的平方和会无限循环,始终变不到1,也就是说求和的过程中,sum会重复出现,因此我们抓住这一关键特征,判......
  • LeetCode 349. 两个数组的交集
    题目链接:LeetCode349.两个数组的交集题意:本题题意是让我们找出两个数组中的交集,注意交集中不能出现重复元素解题思路:思路比较常规,先遍历数组num1,对于每个首次出现的数字,对应位置上的数值+1,再遍历数组num2,判断当前数字是否在num1中出现,如果出现,就加入到结果集中完整代码如......
  • LeetCode 242. 有效的字母异位词
    题目链接:LeetCode242.有效的字母异位词题意:本题是要判断两个字符串s和t,是否是字母异位词,所谓字母异位次就是如果s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。解题思路:首先我们很容易想到,最简单的思路就是先遍历一遍s字符串,统计出每个字母出现的次数......
  • Leetcode11~20题整理
    11.盛最多水的容器比较暴力的做法:classSolution{public:intmaxArea(vector<int>&h){vector<int>t;intn=h.size();intres=-1;for(inti=0;i<n;i++){for(intj=0;j<(int)t.size(......
  • LeetCode 134.加油站
    1.题目:在一条环路上有n 个加油站,其中第i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返回......