leetcode 473. 火柴拼正方形(DFS,回溯)
题目链接
题意
给定一串数,判断这串数字能不能拼接成为正方形
思路
DFS,但是不能每次从从序列开始往下搜索,因为这样无法做到四个边覆盖不同位置的值,比如输入是(5,5,5,5,4,4,4,4,3,3,3,3)这种情况
以四条边分类讨论,每次加入序列的值,最后判断四条边的结果是否相等
其次注意剪枝:
- 首先将序列逆序排列,尤其遇到(1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4....),如果正着搜索那么一定会超时
- 每一轮检查每条边加上序列的值,得到的结果如果大于边长,那么直接剪枝
class Solution {
public:
int avr=-1;
bool dfs(vector<int> nums,int pos,int cnt[4]){
if(pos==-1){
return cnt[0]==cnt[1] && cnt[1]==cnt[2] && cnt[2]==cnt[3] && cnt[3]==avr;
}
//对每一个段的值进行统计
for(int i=0;i<4;i++){//对每一段分别统计
if(cnt[i]+nums[pos]>avr) continue;//剪枝
cnt[i]+=nums[pos];
if(dfs(nums,pos-1,cnt)) return true;
cnt[i]-=nums[pos];
}
return false;
}
bool makesquare(vector<int>& nums) {
int sum=0;
for(int num:nums) sum+=num;
if(sum%4!=0) return false;
if(!nums.size()) return false;//特判一下[]
avr=sum/4;
sum=0;
//排序一下,减少调用次数,从大到小调用,类似于剪枝
sort(nums.begin(),nums.end());
int cnt[4]={0};
return dfs(nums,nums.size()-1,cnt);
}
// bool dfs(vector<int> nums,int sum,int pos,int cnt){ //记录四条边的长度
// if(sum>avr) return false;
// if(sum==avr) {
// cnt++;
// sum=0;
// }
// if(pos==nums.size()){
// if(cnt==4) return true;
// else return false;
// }
// for(int i=pos;i<nums.size();i++){
// sum+=nums[i];
// if(dfs(nums,sum,i+1,cnt)) return true;//只能判断连续的值
// sum-=nums[i];
// }
// return false;
// }
// bool dfs(vector<int> nums,vector<int> tmp,int pos){
// if(tmp.size() && tmp[tmp.size()-1]>avr) return false;
// if(tmp.size()>4) return false;
// if(tmp.size()==4){
// if(tmp[0]==tmp[1] && tmp[1]==tmp[2] && tmp[2]==tmp[3] &&tmp[0]==avr) return true;
// return false;
// }
// for(int i=pos;i<nums.size();i++){//顺序不是连在一起的
// tmp.push_back()
// }
// return false;
// }
// bool dfs(vector<int> nums,int pos,vector<int> cnt(4,0)){//每一部分的和
};
leetcode 473. 火柴拼正方形(DFS,回溯)的更多相关文章
- Java实现 LeetCode 473 火柴拼正方形
473. 火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到 ...
- Leetcode 473.火柴拼正方形
火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到. 输入为 ...
- Leetcode之深度优先搜索(DFS)专题-473. 火柴拼正方形(Matchsticks to Square)
Leetcode之深度优先搜索(DFS)专题-473. 火柴拼正方形(Matchsticks to Square) 深度优先搜索的解题详细介绍,点击 还记得童话<卖火柴的小女孩>吗?现在, ...
- 473 Matchsticks to Square 火柴拼正方形
还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到.输入为小女孩拥有火柴的 ...
- [Swift]LeetCode473. 火柴拼正方形 | Matchsticks to Square
Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...
- LeetCode刷题 DFS+回溯
一.DFS介绍 二.LeetCode 实战 LC 17. 电话号码的字母组合 解法思路 解题步骤 代码 LC 79. 单词搜索 解题思路 解题步骤 代码 LC 46. 全排列 解题思路一 解题步骤 代 ...
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)
39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...
- 【POJ - 3009】Curling 2.0 (dfs+回溯)
-->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...
随机推荐
- vue第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法)
第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法) #课程目标 了解 vue 框架的特点 掌握创建 vue 实例 掌握 data ...
- Eureka系列(二) 服务注册Server端具体实现
服务注册 Server端流程 我们先看下面这张图片,这张图片简单描述了下我们EurekaClient 在调用EurekaServer 提供的服务注册Http接口,Server端实现接口执行的大致流 ...
- jmeter性能测试-高并发分布式部署
jmeter什么要做分布式部署? jmeter是运行在JVM虚拟机上的,当模拟大量并发时,对运行机器的性能/网络负载会很大. 此时就需要使用jmeter的分布式部署功能,实现多台被控机器同时并发访问被 ...
- matplotlib的学习7-tick能见度
import matplotlib.pyplot as plt import numpy as np ''' 当图片中的内容较多,相互遮盖时,我们可以通过设置相关内容的透明度来使图片更易于观察,也即是 ...
- day021|python之面向对象进阶1
面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...
- 制作3D小汽车游戏(下)
书接上回,这一节我们分模块说一说怎么写一个这样的游戏 1. 初始化场景.相机和渲染器 这几乎是绘制three必须做的事情,我们有两套场景和相机,一个是主场景和相机,另一个是小地图的场景和相机(用来俯视 ...
- 去掉关闭按钮同时禁用alt+f4进行关闭
public int ctype = 0; private const int GWL_STYLE = -16; private const int WS_SYSMENU = 0x80000; [Sy ...
- (七)、touch--创建文件或者更新时间戳
一.命令说明与格式 创建文件并更新时间戳,若要创建的文件名已经存在,则仅仅更新时间戳,而不改变其他任何信息 格式:touch [选项] 目录名/文件名 选项: -a ...
- python初学者-输入一个数判断奇偶性
num = int(input("请输入一个整数:")) if num%2 == 0: print("这个数是偶数",num) else: print(&quo ...
- Netty源码解析 -- PoolChunk实现原理(jemalloc 3的算法)
前面文章已经分享了Netty如何实现jemalloc 4算法管理内存. 本文主要分享Netty 4.1.52之前版本中,PoolChunk如何使用jemalloc 3算法管理内存. 感兴趣的同学可以对 ...