【Lintcode】371. Print Numbers by Recursion

题目地址:

https://www.lintcode.com/problem/print-numbers-by-recursion/description

给定正整数NN,返回从11开始数到NN99的所有数字。要求用递归。

如果N=1N=1,那么直接返回[1,2,3,4,5,6,7,8,9][1,2,3,4,5,6,7,8,9]即可。我们考虑如何从NN跨步到N+1N+1。我们发现,当N=2N=2N=3N=3时,不过就是在N=2N=2的答案后面添加109910\sim 99乘以1010再加上191\sim 9,也就是添加101109101\sim 109111119111\sim 119,等等。而当N=3N=3N=4N=4时,就是在N=3N=3的答案后面添加100999100\sim 999乘以1010再加上191\sim 9。这就可以用递归了。我们需要将从“乘以1010再加上191\sim 9”的起始位置作为参数传递下去。代码如下:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    /**
     * @param n: An integer
     * @return: An array storing 1 to the largest number with n digits.
     */
    public List<Integer> numbersByRecursion(int n) {
        // write your code here
        List<Integer> res = new ArrayList<>();
        if (n == 0) {
            return res;
        }
        
        for (int i = 1; i <= 9; i++) {
            res.add(i);
        }
        
        dfs(n, res, 0);
        return res;
    }
    
    private void dfs(int n, List<Integer> res, int start) {
        if (n == 1) {
            return;
        }
    
        int size = res.size();
        for (int i = start; i < size; i++) {
            for (int j = 0; j <= 9; j++) {
                res.add(res.get(i) * 10 + j);
            }
        }
        
        dfs(n - 1, res, start * 10 + 9);
    }
}

时间复杂度O(10N)O(10^N),空间O(N)O(N)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章