这个帖记录的是一些让我觉得值得学习,自己解题的时候想不到的大佬思路,直接Respect给到
二进制手表
这道题数据量很少,直接枚举也可以完成,但是我看到这道题总想用回溯来做,但是思路显得很笨重,看提交详情的时候看到了一个大佬的代码,直接用数组来模拟灯亮的情况,这个思路非常值得我学习
用数组模拟灯亮:
// 直接把二进制的问题转换为数组累加问题
int[] hours = new int[]{1,2,4,8,0,0,0,0,0,0};
int[] minutes = new int[]{0,0,0,0,1,2,4,8,16,32};
回溯的方法体:
// 回溯的参数:num(需要点亮的灯,初始为turnedOn),index(点亮的下标)
// hour(小时数)minute(分钟数)
public void backTrack(int num,int index,int hour,int minute){
// 剪枝操作
if(hour > 11 || minute > 59) return;
// 递归出口,当点亮到第0栈灯的时候,那么回溯所有数据
if(num == 0){
// 进行字符串拼接
StringBuilder sb = new StringBuilder();
sb.append(hour).append(':');
if(minute < 10){
sb.append('0');
}
sb.append(minute);
res.add(sb.toString());
//记得return终止掉
return;
}
// 这里是从下标开始递归遍历
for(int i = index; i < 10; i++){
// 这里模拟每次点亮一盏灯
backTrack(num - 1, i + 1, hour + hours[i], minute + minutes[i]);
}
}
单词接龙II
一道很顶的题目!单纯用BFS或者DFS 简单的优化都过不了,一种可行的办法是BFS+DFS,先遍历得到最短路径再用DFS爆搜结果。继续优化的话就是将每个节点的所有相邻节点保存到 HashMap 中,就省去了 DFS 再去找相邻节点的时间。
很顶的题解 直接看: 题解