Lexicographical Numbers解题报告

Description:

Given an integer n, return 1 - n in lexicographical order.

Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.

Example:

For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].

Link:

https://leetcode.com/problems/lexicographical-numbers/#/description

解题方法:

回溯法:
这道题先生成数字在排序是行不通的,所以要采用边生成数字边排序的方法。
譬如给出的例子n = 13,当生成13以后,需要回溯到2
所以这道题可以使用递归做。

首先定义如何生成数字:数字分为两部分,selfaddself定义着一个数的层数(比如1,2,3都是同一层,self都是1,都是个位数这一层);add为加数,self + add才构成了同一层的不同数。
递归的构成:
参数:self初始化为0add初始化为1int n返回数组
出口:当self > n || add > 9 || self + add > nreturn掉
递归函数体:先往下一层递归,即下一层的self = (self + add) * 10add0开始;然后再往同层数不同数递归,即self不变,add++

Time Complexity:

O(N)

完整代码:

class Solution 
{
public:
    vector lexicalOrder(int n) 
    {
        vector result;
        if(n == 0)
            return result;
        lexi(0, 1, n, result);
        return result;
    }
    void lexi(int self, int add, int n, vector& result)
    {
        if(self > n || add > 9 || self + add > n)
            return;
        result.push_back(self + add);
        lexi((self + add) * 10, 0, n, result);
        lexi(self, add + 1, n, result);
    }
};

你可能感兴趣的:(Lexicographical Numbers解题报告)