【中等】力扣算法题解析LeetCode351:安卓系统手势解锁

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒LeetCode 351: 安卓系统手势解锁

问题抽象: 给定两个整数 mn1 ≤ m ≤ n ≤ 9),要求计算在 安卓手势解锁模式 中,所有长度介于 mn有效手势路径数量,满足以下核心需求:

  1. 手势规则定义

    • 手势路径在 3×3 网格(点编号 19)上绘制,连续连接 未访问过的点;
    • 相邻点跳跃约束:若两点间存在 未访问的中间点(如 1→3 需经过 2),则跳跃 无效(除非中间点已被访问)。
  2. 路径有效性要求

    • 路径长度需满足 m ≤ len ≤ nlen 为连接的点数);
    • 每个点 仅可使用一次(路径不可重复访问点);
    • 路径 必须连续(相邻两点需满足跳跃规则)。
  3. 计算约束

    • 需统计 所有可能的起点9 个点)生成的合法路径;
    • 时间复杂度 O(9!)(回溯搜索),空间复杂度 O(9)(存储访问状态);
    • 需预处理 跳跃规则映射(如 (1,3)→2, (1,7)→4 等)。
  4. 边界处理

    • m=1, n=1 时,输出 9(仅单点手势);
    • m=1, n=2 时,输出 65(单点 9 种 + 两点 56 种);
    • 对称性优化:点 1,3,7,9 对称,点 2,4,6,8 对称,点 5 独立。

输入:整数 m(最小长度),整数 n(最大长度)。
输出:所有有效手势路径的总数量(整数值)。


解题思路

题目要求计算在安卓解锁屏幕中,至少连接 m 个且至多连接 n 个键的所有解锁模式数量。解决思路

  1. 预处理跳跃关系:使用二维数组 jump 记录任意两点间的中间点(如 jump[1][3] = 2)。
  2. DFS + 回溯:遍历每个起点(1~9),通过DFS生成所有有效路径:
    • 维护 visited 数组记录已访问点。
    • 对于当前点 cur,尝试访问下一个点 next
      • next 未被访问,检查 curnext 是否需要中间点:
        • 不需要中间点(jump[cur][next] == 0),或中间点已被访问,则允许访问 next
    • 路径长度在 [m, n] 时计数。
  3. 剪枝优化:路径长度达到 n 时停止深入(最多连接 n 个点)。
  4. 对称性优化:利用对称性减少重复计算(1/3/7/9对称,2/4/6/8对称,5单独处理),但代码中直接遍历所有起点已足够高效。

代码实现(Java版)🔥点击下载源码

class Solution {
   
   
    private int[][] jump; // 跳跃数组:jump[i][j]表示i到j的中间点
    private boolean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值