473. 火柴拼正方形

给定很多小短火柴,拼成一个正方形

用到的技巧

1.  排序,传参数,起到剪枝的效果,排序后前面搜索过的在下层时直接跳过,具体体现为 for (int i = idx;i<n;i++)

2. 找到正确答案返回true,变为找到不可行的方案之一直接return false;正确答案只有一个,false答案有很多歌;能加快速度。

class Solution {
public://改进版搜索回溯 之前的搜索是以找到正确的解为代价 正确的解就一个 很难找 现在反过来 找到错的直接返回,即在所有剩下的火柴中没有凑到边长 直接return falseint n;bool makesquare(vector<int>& nums) {n = nums.size();if(n<4)return false;int sum = accumulate(nums.begin(),nums.end(),0);if(sum%4) return false;int avg = sum/4;sort(nums.rbegin(),nums.rend());vector<bool> visit(n);for(int i = 0;i<4;i++){if(!find(nums,visit,0,avg)) return false;}return true;}bool find(vector<int>& nums,vector<bool>& visit,int idx,int ave){if(ave==0) return true;for (int i = idx;i<n;i++){if(!visit[i]){if(nums[i]<=ave){visit[i] = true;if(find(nums,visit,i+1,ave-nums[i])) return true;visit[i] = false;}} }return false;}
};/*//经典dfs 1回溯//对nums排序就相当于剪枝,因为先放大的数 会减小后面分支的数目 比如[2,3,6,4,...],avg=10 放最大的6和4 就会让快速满足第一条边 不然如果前面放3和2 那么在搜索满足第一条边的条件时后面会发生很多分支int n;bool makesquare(vector<int>& nums) {n = nums.size();if(n<4)return false;int sum = accumulate(nums.begin(),nums.end(),0);if(sum%4) return false;int avg = sum/4;sort(nums.rbegin(),nums.rend());//不从大到小排序会超时vector<int> edges(4,0);return dfs(nums,edges,0,avg);}bool dfs(vector<int>& nums,vector<int>& edges,int pos,int avg){if(pos==n){return (edges[0]==avg && edges[1]==avg && edges[2]==avg);}for(int i = 0;i<4;i++){if(edges[i]+nums[pos]>avg)continue;edges[i]+=nums[pos];if(dfs(nums,edges,pos+1,avg))return true;edges[i]-=nums[pos];}return false;}
};
*//** 2.直接暴力搜索 不优化的话可能超时
class Solution {public boolean makesquare(int[] nums) {if(nums.length ==0 ) return false;int sum =0;for (int i = 0; i < nums.length; i++) {sum+=nums[i];}if(sum/4*4!=sum) return false;return dfs(nums,0,nums.length,0,0,0,0,sum/4);}private boolean dfs(int[] nums, int i, int length, int i1, int i2, int i3, int i4, int i5) {if(i==length){if(i1==i5 && i2==i5 && i3==i5 && i4==i5 ) return true;else return false;}if(i1>i5 || i2>i5 || i3>i5 || i4>i5 ) return false;return dfs(nums,i+1,length,i1+nums[i],i2,i3,i4,i5)||dfs(nums,i+1,length,i1,i2+nums[i],i3,i4,i5)||dfs(nums,i+1,length,i1,i2,i3+nums[i],i4,i5)||dfs(nums,i+1,length,i1,i2,i3,i4+nums[i],i5);}
}*/

经典回溯之火柴拼正方形相关推荐

  1. LeetCode 473. 火柴拼正方形

    473. 火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到 ...

  2. LeetCode 473. 火柴拼正方形(回溯)

    文章目录 1. 题目 2. 解题 1. 题目 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法. 不能折断火柴,可以把火柴连接起 ...

  3. 【Leetcode刷题Python】473. 火柴拼正方形

    1 题目 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度.你要用 所有的火柴棍 拼成一个正方形.你 不能折断 任何一根火柴棒,但你可以把它 ...

  4. 【473. 火柴拼正方形】

    来源:力扣(LeetCode) 描述 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度.你要用 所有的火柴棍 拼成一个正方形.你 不能折断 ...

  5. 算法----火柴拼正方形

    题目 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度.你要用 所有的火柴棍 拼成一个正方形.你 不能折断 任何一根火柴棒,但你可以把它们连 ...

  6. 473. 火柴拼正方形

    还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到. 输入为小女孩拥有火柴 ...

  7. [Swift]LeetCode473. 火柴拼正方形 | Matchsticks to Square

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  8. LeetCode473. 火柴拼正方形

    目录 文章目录 一.题目 二.解题思路 三.知识总结 1.C++ sort()排序函数用法详解 2.accumulate()函数 总结 一.题目 你将得到一个整数数组 matchsticks ,其中 ...

  9. 【Leetcode473】火柴拼正方形(递归与回溯)

    题目详情见官网 为什么又把它捞出来了呢?因为 广联达开发的暑期实习笔试 今天考了这个原题,只是背景不同,让我们温故而知新吧. 思维导图攻破算法难题 算法思路视频讲解请点击--> b站鲁班代师讲解 ...

最新文章

  1. android开发之svg全面总结
  2. docker中命令docker images
  3. 以太坊智能合约 编译脚本
  4. 计算机基础简介、编程语言、翻译器、数据储存
  5. live2dviewer android,live2dviewerex安卓版
  6. Facebook Graph API(2)--读取数据之picture
  7. Windows Phone 7 利用计时器DispatcherTimer创建时钟
  8. 巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合
  9. redis和zookeeper安装教程并配置开机自启
  10. Android隐藏桌面图标实现
  11. hadoop常见组件及其功能
  12. php抽奖的数字滚动器,JS数字抽奖游戏实现方法
  13. HTML-滚动字幕的源代码(可作滚动公告)
  14. 解决pycharm终端/cmd运行python脚本报错“ImportError/ModuleNotFoundError:No Module named ...”
  15. 集成友盟第三方实现QQ微信登录遇到的坑
  16. mysql优化之 Using where; Using join buffer (Block Nested Loop) ,索引失效,检查项
  17. 内存管理器(十)kernel内存管理----数据结构
  18. Problem T 分数拆分问题(第四讲)
  19. 动画特效五:灌水动画
  20. 软件测试之计算机基础

热门文章

  1. “约见”面试官系列之常见面试题之第四十五篇CSS优先级(建议收藏)
  2. 前端学习(1682):前端系列实战课程之让蛇改变方向
  3. spring学习(16):使用接口
  4. 第三十二期:MySQL常见的图形化工具
  5. (总结)HTTP常见错误返回代码
  6. http:(4):http请求方法
  7. linux python pymysql,Python之pymysql的使用
  8. 搜索和在线阅读 Github 代码的插件推荐
  9. mysql主要的收获_MySQL性能测试大总结
  10. HDU 4291 A Short problem 矩阵快速幂 循环节