(LeetCode 每日一题)386. 字典序排数(递归、深度优先搜索dfs || 递推)
题目:386. 字典序排数
方法一:递归,深度优先搜索dfs,时间复杂度0(n)。
C++版本:
class Solution {public:void dfs(int u,int n,vector<int> &v){if(u>n) return ;v.push_back(u);for(int i=0;i<=9;i++){dfs(u*10+i,n,v);}}vector<int> lexicalOrder(int n) {vector<int> v;for(int i=1;i<=9;i++){dfs(i,n,v);}return v;}
};
JAVA版本:
class Solution {void dfs(int u,int n,List<Integer> v){if(u>n) return ;v.add(u);for(int i=0;i<=9;i++){dfs(u*10+i,n,v);}}public List<Integer> lexicalOrder(int n) {List<Integer> v = new ArrayList<>();for(int i=1;i<=9;i++){dfs(i,n,v);}return v;}
}
Go版本:
func lexicalOrder(n int) []int {v:=[]int{}for i:=1;i<=9;i++ {dfs(i,n,&v)}return v
}
func dfs(u int,n int,v *[]int){if u>n {return}*v=append(*v,u)for i:=0;i<=9;i++ {dfs(u*10+i,n,v)}
}
方法二:递推,时间复杂度0(n)。
C++版本:
class Solution {public:vector<int> lexicalOrder(int n) {vector<int> v;int num=1;for(int i=1;i<=n;i++){v.push_back(num);if(num*10<=n){num*=10;}else{while(num%10==9 || num+1>n){num/=10;}num++;}}return v;}
};
JAVA版本:
class Solution {public List<Integer> lexicalOrder(int n) {List<Integer> v = new ArrayList<>();int num=1;for(int i=1;i<=n;i++){v.add(num);if(num*10<=n){num*=10;}else{while(num%10==9 || num+1>n){num/=10;}num++;}}return v;}
}
Go版本:
func lexicalOrder(n int) []int {v:=[]int{}num:=1for i:=1;i<=n;i++ {v=append(v,num)if(num*10<=n){num*=10}else{for num%10==9 || num+1>n {num/=10}num++}}return v
}