而如果按照前序遍历的顺序遍历这棵树,得到的整数序列就是字典序从小到大的。但是这棵树深度是没有限制的啊,所以如果遍历到的数字 x 大于 n 的话,就要结束遍历,回溯到上一层。
时间复杂度是 $O(n)$ ,空间复杂度是 $O(n)$。
代码
排序法(c++)
classSolution { public: vector<int> lexicalOrder(int n){ vector<string> s; vector<int> res; for (int i = 1; i <= n; ++i) s.push_back(to_string(i)); sort(s.begin(), s.end()); for (int i = 0; i < n; ++i) { res.push_back(atoi(s[i].c_str())); } return res; } };
排序法(python)
classSolution: deflexicalOrder(self, n: int) -> List[int]: res = [] for i inrange(1, n+1): res.append(str(i)) res.sort() res = [int(x) for x in res] return res
字典树法(c++)
classSolution { public: vector<int> lexicalOrder(int n){ vector<int> res; for (int i = 1; i <= 9; ++i) dfs(i, n, res); return res; }
voiddfs(int x, int n, vector<int>& res){ if (x > n) return; res.push_back(x); for (int i = 0; i <= 9; ++i) { dfs(x*10+i, n, res); } } };
字典树法(python)
classSolution: deflexicalOrder(self, n: int) -> List[int]: res = [] for i inrange(1, 10): self.dfs(i, n, res) return res
defdfs(self, x, n, res): if x > n: return res.append(x) for i inrange(10): self.dfs(x*10+i, n, res)