☘前言☘
开更五月集训专题,由浅入深,深入浅出,飞向大厂!
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min
565. 数组嵌套
解题思路
对每个元素进行统计,
代码
class Solution {
int hash[200009];
int dfs(vector<int>& nums,int i){
if(hash[i]) return hash[i];
hash[i] = 1; //标记
hash[i] = dfs(nums,nums[i]) + 1;
return hash[i];
}
public:
int arrayNesting(vector<int>& nums) {
int ans = 0,size = nums.size();
memset(hash,0,sizeof(hash));
for(int i = 0;i < size;++i)
ans = max(dfs(nums,i) - 1,ans);
return ans;
}
};
注意的点
不算难,但是是我的薄弱项
401. 二进制手表
解题思路
直接暴搜
代码
class Solution {
int on,h,m, quan[6] = {1,2,4,8,16,32};
vector<string> ans;
string ntos(){
char tmp[8] = "";
sprintf(tmp,"%d:%02d",h,m);
string ans(tmp,tmp+strlen(tmp));
return ans;
}
void dfs(int now,int maxdeng,int turnedOn){
if(now == maxdeng) return; //超过了灯数 不整了
if(now < 4) h += quan[3 - now];
else m += quan[9 - now];
if(h < 12 && m < 60){
++on;
if(on == turnedOn) ans.push_back(ntos());
else dfs(now+1,maxdeng,turnedOn);
--on; //还原现场
}
if(now < 4) h -= quan[3 - now];
else m -= quan[9 - now];
dfs(now + 1,maxdeng,turnedOn);
}
public:
vector<string> readBinaryWatch(int turnedOn) {
on = h = m = 0; //初始化
ans.resize(0);
if(turnedOn == 0) ans.push_back(ntos()); //0的话特判
dfs(0,10,turnedOn);
return ans;
}
};
注意的点
- 0需要特判,因为我写的dfs只能至少开一盏灯才可以加入,否则的话会产生很多重复。。
- 转换的时候还是sprintf好用,再转成string完事
1079. 活字印刷
解题思路
直接全部遍历,然后利用set去重。
代码
class Solution {
set<string> ans;
char stk[10],top;
bool visited[10];
void dfs(string tiles,int now,int maxi){
if(now == maxi){
stk[++top] == '\0';
ans.insert(stk);
--top;
return;
}
int size = tiles.size();
for(int i = 0;i < size;++i){
if(!visited[i]){
visited[i] = true;
stk[++top] = tiles[i];
dfs(tiles, now + 1,maxi);
--top;
visited[i] = false;
}
}
}
public:
int numTilePossibilities(string tiles) {
ans.clear();
top = -1;
memset(visited,0,sizeof(visited));
int size = tiles.size();
for(int i = 1;i <= size;++i)
dfs(tiles,0,i);
return ans.size();
}
};
注意的点
- 一开始要进行全局变量的初始化
- 返回set的大小就是结果
1219. 黄金矿工
解题思路
需要一个hash表记录是否已经访问,然后ans就是记录结果,传入一个sum记录当前的值。其实用全局估计更好。
代码
class Solution {
bool hash[16][16];
int ans;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
void dfs(vector<vector<int>>& grid,int c, int r,int csize,int rsize,int sum){
if(hash[c][r]) return;
sum += grid[c][r];
hash[c][r] = true;
ans = max(ans,sum);
for(int i = 0;i < 4;++i){
c += dir[i][0],r += dir[i][1];
if(c >= 0 && c < csize && r >= 0 && r < rsize && grid[c][r]){
dfs(grid,c,r,csize,rsize,sum);
}
c -= dir[i][0],r -= dir[i][1];
}
hash[c][r] = false;
}
public:
int getMaximumGold(vector<vector<int>>& grid) {
ans = 0;
int csize = grid.size(),rsize = grid[0].size();//记录一下大小
memset(hash,0,sizeof(hash));
for(int i = 0;i < csize;++i)
for(int j = 0;j < rsize;++j)
if(grid[i][j]) //如果有黄金 当作起点
dfs(grid,i,j,csize,rsize,0);
return ans;
}
};
注意的点
- 注意一定visit之后修改修改过的变量。
写在最后
今天跟昨天一比差距也太大了点。。。。不过深搜本来就难一点