1、题目描述

2、解题思路
题目要求统计至少经过 m 个点,但是不超过 n 个点的所有解锁手势种类数量,因此,我们分别统计走过 m、走过 m+1、…、走过 n 个点的解锁手势种类,然后全部加起来就是至少经过 m 个点又不超过 n 个点的手势种类数。
以下为统计走过 i 个点的手势种类数计算:
我们从一个点出发,不断滑来滑去,直到总共划过 i 个点,就是一种解锁手势,现在要统计总共有多少种,很明显要进行 DFS,即深度优先搜索遍历。
而且再仔细观察本题,会发现一个规律:从 1、3、7、9 出发的种类数是一样的,从 2、4、6、8 出发的种类数也是一样的。
因此,我们只要计算从 1 出发的解锁种类数;然后乘以4,计算 从 2 出发的解锁种类数,然后乘以 4;最后加上从 5 出发的解锁种类数;三者加起来,就是经过 i 个点的手势种类数了。
本题还有一个要求,即,如果两个点中间存在未走过的点,是不能走过去的。
因为总共才 1-9 的点,我们用二维整型数组 skip[][] 来记录两点中间的点的情况,比如 skip[1][3] = 2,表示 1 和 3 中间有一个 2。
再用一个一维布尔型数组 visited[] 来表示某个点是否走过,比如 visited[3] true 表示 3 已经走过。
明白了上面的准备工作,我们就可以设计 DFS 函数了,DFS 函数的功能是:统计从某个点出发的所有不同的解锁手势的种类数。
public int DFS(int current, boolean []visited, int [][]skip,int remainKeyCount);
其中,current 表示出发点,remainKeyCount 表示走了 current 后的剩余可走步数。
注意:在 DFS 函数的开始,要把 current 设置为 true,到 DFS 函数结束之前,要重新设置为 false。毕竟每一个点都是可以重复利用的。
3、解题代码
class Solution {
public int numberOfPatterns(int m, int n) {
int[][] skip = new int[10][10];
//这个skip数组是为了记录跳跃的点数,比如说从1到3,就跳跃2
//而且因为是对称的操作,所以3到1也是如此
skip[1][3] = skip[3][1] = 2;
ski

本文介绍了一个统计解锁手势种类数量的问题解决方法,通过深度优先搜索(DFS)遍历所有可能的解锁路径,考虑到对称性和跳跃点数的限制,最终得出至少经过m个点不超过n个点的所有解锁手势种类数量。

1190

被折叠的 条评论
为什么被折叠?



