473. 火柴拼正方形

题目

(https://leetcode-cn.com/problems/matchsticks-to-square/)
还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。

输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。

示例 1:

输入: [1,1,2,2,2]
输出: true

解释: 能拼成一个边长为2的正方形,每边两根火柴。
示例 2:

输入: [3,3,3,3,4]
输出: false

解释: 不能用所有火柴拼成一个正方形。
注意:

给定的火柴长度和在 0 到 10^9之间。
火柴数组的长度不超过15。

分析

首先判断什么情况下不能形成正方形。什么情况可以。
如果边数少于4跟边数不是4的倍数。肯定不能形成正方形

首先我们一边一边放火材。如果超过边长的话,就回溯。一直到每个边都刚好摆成正方形
就无脑遍历。

代码

class Solution {
    public boolean makesquare(int[] nums) {
        //如果边少于4不能形成正方形
         if (null == nums || nums.length<4){
                return false;
            }
            int account = 0 ;
            for (int temp:nums) {
                account += temp;
            }
        //变数总和不是4的倍数不能成为正方形
            if (account%4!=0){
                return false;
            }
            //冒泡排序 降序
            for (int k = 0; k < nums.length - 1; k++) {
                for (int j = k + 1; j < nums.length; j++) {
                    if (nums[k] < nums[j]) {
                        int temp = nums[k];
                        nums[k] = nums[j];
                        nums[j] = temp;
                    }
                }
            }
            int sideLength = account/4;
            for (int i:nums) {
                //如果有一边大于边长。不能形成正方形
                if (i>sideLength){
                    return false;
                }
            }
        //四边
            int [] sides = new int[4];

            boolean search = search(0, sides, nums, sideLength);

            return search;
    }
    private static boolean search(int pos,int[] sides,int[] nums,int sideLength) {
            //遍历完成后判断每一边是否都相等
            if(pos >= nums.length){
                return  sides[0] == sideLength && sides[1] == sideLength
                        && sides[2] == sideLength && sides[3] == sideLength;
            }

            for (int i = 0; i < sides.length; i++) {
                if (sides[i]+nums[pos]>sideLength){
                    continue;
                }
                sides[i] += nums[pos];

            
                if (search(pos+1,sides,nums,sideLength)){
                    return true;
                };
                //回溯
                sides[i] = sides[i]-nums[pos];
            }



            return false;
        }
}

结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 更多干货就在我的个人博客 BlackBlog.tech 欢迎关注!也可以关注我的csdn博客:黑哥的博客谢谢大家!...
    BlackBlog__阅读 1,392评论 0 5
  • 长方形与正方形 教学目标: 1、 结合观察、操作活动,能够用自然的语言描述长方形和正方形的特征。 2、 了解折、画...
    密芬阅读 1,551评论 0 1
  • 作者:yooongchun个人网站:www.yooongchun.com转载申明:文章内容原创,转载请注明出处! ...
    yooongchun阅读 2,376评论 0 1
  • 这几日,许多交大的同事朋友都在晒校园里的樱花。突然产生了回去赏樱花的想法。 西交大每年的樱花季是最迷人的。这时侯,...
    卡斯特罗梁阅读 386评论 0 0
  • 儿子送走了,行李铺盖顺丰快递。 在义乌售票窗口折腾半个小时,反复弹出的“验证码错误”把我搞蒙了。好言好语对待售票小...
    石默默阅读 219评论 0 0