zoukankan      html  css  js  c++  java
  • [LeetCode] Strobogrammatic Number II

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).

    Find all strobogrammatic numbers that are of length = n.

    For example,
    Given n = 2, return ["11","69","88","96"].

     

    Run some examples

    n = 0, null;
    n = 1, [0, 1, 8]
    n = 2, [11, 69, 88, 96]
    n = 3, [101, 609, 808, 906,
    111, 619, 818, 916,
    181, 689, 888, 986]
    n = 4, [1001, 6009, 8008, 9006,
    1111, 6119, 8118, 9116,
    1691, 6699, 8698, 9696,
    1881, 6889, 8888, 9886,
    1961, 6969, 8968, 9966]

    Brainstorming:
    For a given n, each of its result in the list are generated by doing the following.
    For each of the result of length n - 2 :
    add 1 on its left and 1 on its right;
    add 6 on its left and 9 on its right;
    add 8 on its left and 8 on its right;
    add 9 on its left and 6 on its right;
    add 0 on its left and 0 on its right; (special case: 0 can not be added to either end when constructing the final result)

    Recursive solution:
    Runtime: The number of results in relation to n is 3 * 2^(n-1) for n >= 1 when n is odd;
    5 * 2^(n-2) for n >=2 when n is even;
    so the run time is exponential O(2^n). It is optimal since there are exponential number of solutions.

    Space complexity: for odd n, 3 * (2^(n-1) + 2^(n-3) + .........+ 1 ) O(2^n);
    similar when n is even.

     

    public class Solution {
        public List<String> findStrobogrammatic(int n) {
            List<StringBuilder> sbList = findRecursive(n, n);
            List<String> ans = new ArrayList<>();
            for(StringBuilder sb: sbList) {
                ans.add(sb.toString());
            }
            return ans;
        }
        
        private List<StringBuilder> findRecursive(int currLen, int targetLen)
        {
            List<StringBuilder> r = new ArrayList<StringBuilder>();
            if(currLen == 0)
            {
                r.add(new StringBuilder(""));
                return r;
            }
            if(currLen == 1)
            {
                r.add(new StringBuilder("0"));
                r.add(new StringBuilder("1"));
                r.add(new StringBuilder("8"));
                return r;
            }
            
            List<StringBuilder> shorter = findRecursive(currLen - 2, targetLen);
            for(StringBuilder sb : shorter)
            {
                if(currLen != targetLen)
                {
                    r.add(new StringBuilder("0").append(sb).append("0"));
                }
                r.add(new StringBuilder("1").append(sb).append("1"));
                r.add(new StringBuilder("6").append(sb).append("9"));
                r.add(new StringBuilder("8").append(sb).append("8"));
                r.add(new StringBuilder("9").append(sb).append("6"));
            }
            
            return r;
        }
    }

    Related Problems

    [LeetCode] Strobogrammatic Number III

  • 相关阅读:
    子类构造函数 supper关键字
    匿名内部类
    IK 分词器 源码分析
    java重写equals方法
    java编程思想
    设置centos7默认运行级别
    centos7配置wordpress
    python安装tkinter
    centos 7编译安装apache
    关于python中带下划线的变量和函数 的意义
  • 原文地址:https://www.cnblogs.com/lz87/p/7038575.html
Copyright © 2011-2022 走看看