一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して18日目です。クリックしてイベントの詳細をご覧ください。
トピックの説明
これは386です。LeetCodeの辞書式番号、中程度の。
タグ:「DFS」、「再帰」、「反復」
整数n
を返し、辞書式順序で範囲を返します
すべての整数。
時間計算量を設計する必要があります と使用 エクストラスペースのアルゴリズム。
例1:
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
复制代码
例2:
输入:n = 2
输出:[1,2]
复制代码
ヒント:
再帰
まず第一に、これを達成するために「再帰」を使用することを考えるのは簡単DFS
です。
意思 は、辞書式順序で回答に追加されます。基本的に、 、辞書ツリーに似た形状のマルチオーダーツリーがトラバースされ、ルートノードは ,需要被跳过,因此我们可以从树的第二层开始搜索。
树中每个节点的值为其搜索路径所代表的数字,且每个节点有 共 个子节点。
代码:
class Solution {
List<Integer> ans = new ArrayList<>();
public List<Integer> lexicalOrder(int n) {
for (int i = 1; i <= 9; i++) dfs(i, n);
return ans;
}
void dfs(int cur, int limit) {
if (cur > limit) return ;
ans.add(cur);
for (int i = 0; i <= 9; i++) dfs(cur * 10 + i, limit);
}
}
复制代码
- 时间复杂度:本质上在搜索一棵节点数量为 的多阶树(形态类似于字典树),复杂度为
- 空间复杂度:忽略递归带来的额外空间开销,复杂度为
迭代
递归具有额外的空间开销,为了实现严格的
空间,我们需要使用「迭代」来实现 DFS
。
共有 个数需要被处理,假设当前处理到的数为 ,根据字典序规则,在满足条件的前提下,我们优先在 的后面添加 (即 満たされている場合)、それ以外の場合は、前のビットをロールバックして1つ追加することを検討します。
コード:
class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> ans = new ArrayList<>();
for (int i = 0, j = 1; i < n; i++) {
ans.add(j);
if (j * 10 <= n) {
j *= 10;
} else {
while (j % 10 == 9 || j + 1 > n) j /= 10;
j++;
}
}
return ans;
}
}
复制代码
- 時間計算量:
- スペースの複雑さ:
やっと
これは、「BrushthroughLeetCode」シリーズの最初のNo.386
記事シリーズは2021/01/01に始まります。開始日現在、LeetCodeには1916の質問があり、その一部はロックされています。最初にすべての質問を入力します。ロックなし。トピックは終了しました。
このシリーズの記事では、問題解決のアイデアを説明することに加えて、可能な限り最も簡潔なコードを示します。一般的なソリューションが含まれる場合は、対応するコードテンプレートも提供されます。
学生がコンピューター上でコードをデバッグして送信できるようにするために、関連するリポジトリgithub.com/SharingSour…を確立しました。
倉庫の住所には、一連の記事の解決策へのリンク、一連の記事の対応するコード、LeetCodeの元の質問へのリンクおよびその他の推奨される解決策が表示されます。