386. Lexicographical Numbers

整数字典序排列算法
本文介绍了一种高效的算法,用于将1到n之间的所有整数按字典顺序排列。通过两种方法实现:递归构建数字组合及迭代优化,确保了算法的时间复杂度接近O(n),适用于大数据量场景。

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

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

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




    此题,观察数字,可看出具有递归形式,因此采用递归的方式。每层对上层给定的数字下一位组合十个数字进行递归,如10~19,判断大于给定的数值即返回。输入应从0开始,但单个0数字直接返回不计入数组

代码如下:

class Solution {
public:
	vector<int> v;		
	void lex(int t,int n){	
	if( t <= n){
	    int i = 0;
	    if(t == 0 && i == 0){
		i = 1;
	    } else{
	    	Solution::v.push_back(t);
	    }			
	    while(i < 10) {	    
	        if(t*10 +i > n) return ;		        
	    	lex(t*10 +i,n);
	    	i++;
	    }
	} 
	return ;	
    }
    vector<int> lexicalOrder(int n) {
    	 lex(0,n);
        return Solution::v;
    }
};

第二种解法参考网友给出的:

1、从1开始迭代,若1与0组合在范围内计入数组

2、否则,若大于则去除0,且加一,接着判断若加一后进位了则去除0(这里如若999+1==1000则循环判断除去0)

3、从步骤一开始循环n次

代码如下:

class Solution {
public:
    vector<int> lexicalOrder(int n) {
        vector<int> res(n);
        int cur = 1;
        for (int i = 0; i < n; i++) {
            res[i] = cur;
            if (cur * 10 <= n) {
                cur *= 10;
            } else {
                if (cur >= n) 
                    cur /= 10;
                cur += 1;
                while (cur % 10 == 0)
                    cur /= 10;
            }
        }
        return res;
    }
};

我的算法复杂度应当近似于该算法O(n)的复杂度,对有效的数据只进行了一次运算,然而因为是递归调用所以我的运行时间大致比该算法慢了一般时间


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值