题目: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:=1
for 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
}