最后更新

三刷

15-Jan-2017

好熟悉的题了,DFS做,注意比如1-3是经过2的,如果2被访问过,那么1-3也是可以的。

public class Solution {
public int numberOfPatterns(int m, int n) {
int[][] path = new int[10][10];
boolean[] visited = new boolean[10]; /*
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
*/
path[1][3] = path[3][1] = 2;
path[1][7] = path[7][1] = 4;
path[3][9] = path[9][3] = 6;
path[9][7] = path[7][9] = 8; path[1][9] = path[9][1] = 5;
path[2][8] = path[8][2] = 5;
path[3][7] = path[7][3] = 5;
path[4][6] = path[6][4] = 5; int res = 0; for (int i = m; i <= n; i++) {
res += 4 * dfs(i - 1, path, visited, 1);
res += 4 * dfs(i - 1, path, visited, 2);
res += dfs(i - 1, path, visited, 5);
} return res;
} public int dfs(int left, int[][] path, boolean[] visited, int pos) {
if (left == 0) {
return 1;
} else {
visited[pos] = true;
int res = 0;
for (int i = 1; i <= 9; i++) {
if (visited[i]) continue;
if (path[i][pos] == 0 || visited[path[i][pos]]) {
res += dfs(left-1, path, visited, i);
}
}
visited[pos] = false;
return res;
} }
}

这个题我真是做得想打人了卧槽。

题目不难,就是算组合,但是因为是3乘3的键盘,所以只需要从1和2分别开始DFS,结果乘以4,再加上5开始的DFS就行了。

问题是这个傻逼题目的设定是,从1到8不需要经过4或者5。。。

我TEST CASE 2,2 卡了好久好久,做得我怀疑人生了,怎么算都是

(3+5)*4 + 8。。结果答案愣是56.

最后发现题设里从1-8是不需要经过4或者5的,真是要报警了。

https://discuss.leetcode.com/topic/63038/how-many-people-thought-from-1-to-8-should-visit-voth-4-and-5)

public class Solution
{
int res = 0;
public int numberOfPatterns(int m, int n)
{ boolean[][] visited = new boolean[3][3];
visited[0][0] = true;
helper(0,0,m,n,1,visited); //System.out.println(res);
visited = new boolean[3][3];
visited[0][1] = true;
helper(0,1,m,n,1,visited);
//System.out.println(res); res *= 4; visited = new boolean[3][3];
visited[1][1] = true;
helper(1,1,m,n,1,visited); return res; } public void helper(int m, int n, int x, int y, int c, boolean[][] visited)
{
if(c >= x && c <= y) res++; for(int i = 0; i < 3;i++)
for(int j = 0; j < 3; j++)
{ if(jumpable(visited,m,n,i,j))
{
visited[i][j] = true;
helper(i,j,x,y,c+1,visited);
visited[i][j] = false; } }
} public boolean jumpable(boolean[][] visited, int m1, int n1, int m2, int n2)
{
if(visited[m2][n2]) return false;
int x = Math.abs(m1-m2);
int y = Math.abs(n1-n2); // adjacent
if(x <= 1 && y <= 1) return true; // di
if(x == 2 && y == 2) return visited[1][1]; // horizontal
if(x == 0 && y == 2) return visited[m1][1]; // vertical
if(x == 2 && y == 0) return visited[1][n1];
/*
if(x == 1 && y == 2) return visited[m1][1] && visited[m2][1];
if(x == 2 && y == 1) return visited[1][n1] && visited[1][n2];
*/
return true; } }



二刷。

08-Nov-2016

这个题光记得一刷的时候颇有怨念,因为跳马子格不算碰到中间2个,卡了好久

https://discuss.leetcode.com/topic/63038/how-many-people-thought-from-1-to-8-should-visit-voth-4-and-5)

还是以 1 2 5分别作为起点,然后1 和 2的要最后乘以4,因为1-9个数字可以转90°转3次。

这次换了个做法,直接标记所有路径,反正也不是很多。

Time: O(n!)

Space: O(n^2)

public class Solution {
public int numberOfPatterns(int m, int n) {
int[][] path = new int[10][10];
/*
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
*/
path[1][3] = path[3][1] = 2;
path[1][7] = path[7][1] = 4;
path[3][9] = path[9][3] = 6;
path[9][7] = path[7][9] = 8;
path[1][9] = path[9][1] = 5;
path[2][8] = path[8][2] = 5;
path[3][7] = path[7][3] = 5;
path[4][6] = path[6][4] = 5;
int res = 0;
boolean[] visited = new boolean[10];
for (int i = m; i <= n; i++) {
res += 4 * dfs(path, visited, 1, i - 1);
res += 4 * dfs(path, visited, 2, i - 1);
res += dfs(path, visited, 5, i - 1);
}
return res;
} public int dfs(int[][] path, boolean[] visited, int cur, int left) {
if (left == 0) {
return 1;
} else {
int res = 0;
visited[cur] = true;
for (int i = 1; i <= 9; i++) {
if (visited[i]) continue;
if (path[cur][i] == 0 || visited[path[cur][i]]) {
res += dfs(path, visited, i, left - 1);
}
}
visited[cur] = false;
return res;
}
}
}

一刷的办法通过坐标来判断是否经过,也不错……思考起来稍微麻烦点,实际上正解应该是一刷那种不使用N^2空间。

351. Android Unlock Patterns的更多相关文章

  1. [LeetCode] 351. Android Unlock Patterns 安卓解锁模式

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  2. LC 351. Android Unlock Patterns

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  3. [LeetCode] Android Unlock Patterns 安卓解锁模式

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  4. Leetcode: Android Unlock Patterns

    Given an Android 3x3 key ≤ m ≤ n ≤ , count the total number of unlock patterns of the Android lock s ...

  5. Android Unlock Patterns

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  6. [Swift]LeetCode351. 安卓解锁模式 $ Android Unlock Patterns

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  7. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  8. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  9. Leetcode重点 250题-前400 题

    删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于简单题目(例:100题:Same Tree) 删除题意不同,代码基本相同题目(例:136 & ...

随机推荐

  1. Singleton设计模式的一种见解

    单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统中只能出现一个类的实例.这样做当然是有必然的,比 ...

  2. UILabel的高度自适应

    _content = [UILabel new]; _content.text = @"日落时分,沏上一杯山茶,听一曲意境空远的<禅>,心神随此天籁,沉溺于玄妙的幻境里.仿佛我就 ...

  3. linux定时器

    我们常常有设置系统在某一时间执行相应动作的需求,比如设置电脑什么时候自动锁屏,什么时候自动关机,设置应用程序什么时候自动运行,什么时候自动退出.这些与时间相关的功能,都需要依靠操作系统中的定时器来实现 ...

  4. 分数拆分( Fractions Again, UVA 10976)-ACM

    It is easy to see that for every fraction in the form  (k > 0), we can always find two positive i ...

  5. JQUERY1.9学习笔记 之可见性过滤器(一) 隐藏选择器

    描述:选择所有隐藏的元素. jQuery( ":hidden" ) 例:显示出所有隐藏的div元素,并对隐藏的input元素计数. <!doctype html>< ...

  6. BAE Flask UEditor 使用七牛云

    1. 配置BAE支持七牛云的SDK BAE的python requirements当然不支持竞争对手了. 解决方法: 把qiniu这个文件包直接放置在你项目的目录中(与其他app同级) 运行会发现缺少 ...

  7. Python 异常处理--raise函数用法

    raise语句手工引发一个异常: "raise" [expression ["," expression ["," expression]] ...

  8. Mvc 页面缓存 OutputCache VaryByCustom

    优化网站,dotNet MVC 可以通过(OutputCache)特性在某些Action上使用缓存,如果我们想要自定义缓存依据可以通过如下方式进行: 第一步, 在 global.asax.cs 文件中 ...

  9. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  10. ps中常用的快捷键

    ctrl+c  复制 ctrl+v 粘贴 ctrl+n 新建文件 ctrl+s 保存 空格键   手抓工具 ctrl+t  自由变形 ctrl+加号  放大 ctrl+减号  缩小 ctrl+r  标 ...