Description#
Given an integer n
, return all the numbers in the range [1, n]
sorted in lexicographical order.
You must write an algorithm that runs in O(n)
time and uses O(1)
extra space.
Example 1:
Input: n = 13
Output: [1,10,11,12,13,2,3,4,5,6,7,8,9]
Example 2:
Input: n = 2
Output: [1,2]
Constraints:
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Solution:
def lexicalOrder(self, n: int) -> List[int]:
def dfs(u):
if u > n:
return
ans.append(u)
for i in range(10):
dfs(u * 10 + i)
ans = []
for i in range(1, 10):
dfs(i)
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> ans = new ArrayList<>();
for (int i = 1; i < 10; ++i) {
dfs(i, n, ans);
}
return ans;
}
private void dfs(int u, int n, List<Integer> ans) {
if (u > n) {
return;
}
ans.add(u);
for (int i = 0; i < 10; ++i) {
dfs(u * 10 + i, n, ans);
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> ans;
for (int i = 1; i < 10; ++i) dfs(i, n, ans);
return ans;
}
void dfs(int u, int n, vector<int>& ans) {
if (u > n) return;
ans.push_back(u);
for (int i = 0; i < 10; ++i) dfs(u * 10 + i, n, ans);
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| func lexicalOrder(n int) []int {
var ans []int
var dfs func(u int)
dfs = func(u int) {
if u > n {
return
}
ans = append(ans, u)
for i := 0; i < 10; i++ {
dfs(u*10 + i)
}
}
for i := 1; i < 10; i++ {
dfs(i)
}
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| impl Solution {
fn dfs(mut num: i32, n: i32, res: &mut Vec<i32>) {
if num > n {
return;
}
res.push(num);
for i in 0..10 {
Self::dfs(num * 10 + i, n, res);
}
}
pub fn lexical_order(n: i32) -> Vec<i32> {
let mut res = vec![];
for i in 1..10 {
Self::dfs(i, n, &mut res);
}
res
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| /**
* @param {number} n
* @return {number[]}
*/
var lexicalOrder = function (n) {
let ans = [];
function dfs(u) {
if (u > n) {
return;
}
ans.push(u);
for (let i = 0; i < 10; ++i) {
dfs(u * 10 + i);
}
}
for (let i = 1; i < 10; ++i) {
dfs(i);
}
return ans;
};
|
Solution 2#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> ans = new ArrayList<>();
int v = 1;
for (int i = 0; i < n; ++i) {
ans.add(v);
if (v * 10 <= n) {
v *= 10;
} else {
while (v % 10 == 9 || v + 1 > n) {
v /= 10;
}
++v;
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> ans;
int v = 1;
for (int i = 0; i < n; ++i) {
ans.push_back(v);
if (v * 10 <= n)
v *= 10;
else {
while (v % 10 == 9 || v + 1 > n) v /= 10;
++v;
}
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| func lexicalOrder(n int) []int {
var ans []int
v := 1
for i := 0; i < n; i++ {
ans = append(ans, v)
if v*10 <= n {
v *= 10
} else {
for v%10 == 9 || v+1 > n {
v /= 10
}
v++
}
}
return ans
}
|