【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)

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