zoukankan      html  css  js  c++  java
  • LeetCode 935. Knight Dialer

    原题链接在这里:https://leetcode.com/problems/knight-dialer/

    题目:

    A chess knight can move as indicated in the chess diagram below:

     .           

    This time, we place our chess knight on any numbered key of a phone pad (indicated above), and the knight makes N-1 hops.  Each hop must be from one key to another numbered key.

    Each time it lands on a key (including the initial placement of the knight), it presses the number of that key, pressing N digits total.

    How many distinct numbers can you dial in this manner?

    Since the answer may be large, output the answer modulo 10^9 + 7.

    Example 1:

    Input: 1
    Output: 10
    

    Example 2:

    Input: 2
    Output: 20
    

    Example 3:

    Input: 3
    Output: 46

    Note:

    • 1 <= N <= 5000

    题解:

    The question asks distinct numbers could dial.

    It is actually the sum of ways jump ending at each cell.

    Cell 1 could jump to cell 6 and 8. Thus accumlate the current ways count to next ways at 6 and 8.

    Eventually, get all the sum.

    Time Complexity: O(N).

    Space: O(1).

    AC Java: 

     1 class Solution {
     2     public int knightDialer(int N) {
     3         if(N == 0){
     4             return 0;
     5         }
     6         
     7         if(N == 1){
     8             return 10;
     9         }
    10         
    11         int M = 1000000007;
    12         long [] cur = new long[10];
    13         Arrays.fill(cur, 1);
    14         for(int k = 2; k<=N; k++){
    15             long [] next = new long[10];
    16 
    17             next[1] = (cur[6]+cur[8])%M;
    18             next[2] = (cur[7]+cur[9])%M;
    19             next[3] = (cur[4]+cur[8])%M;
    20             next[4] = (cur[3]+cur[9]+cur[0])%M;
    21             next[5] = 0;
    22             next[6] = (cur[1]+cur[7]+cur[0])%M;
    23             next[7] = (cur[2]+cur[6])%M;
    24             next[8] = (cur[1]+cur[3])%M;
    25             next[9] = (cur[2]+cur[4])%M;
    26             next[0] = (cur[4]+cur[6])%M;
    27             
    28             cur = next;
    29         }
    30         
    31         long res = 0;
    32         for(int i = 0; i<10; i++){
    33             res = (res + cur[i]) % M;
    34         }
    35         return (int)res;
    36     }
    37 }

    类似Number of Ways to Stay in the Same Place After Some Steps.

  • 相关阅读:
    C基础02天——笔记
    C基础-指针和数组等价转换
    C基础04天—选择排序笔记
    C基础-标准C语言头文件
    C基础-C的关键字
    Ubuntu linux 环境基本使用
    C基础01天——常量变量笔记
    根据评分,用js输出评价星星的样式
    横向滚动条展示 css
    ajax 城市区域选择三级联动
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11480528.html
Copyright © 2011-2022 走看看