386. Lexicographical Numbers
- Total Accepted: 1486
- Total Submissions: 5876
- Difficulty: Medium
Given an integer n, return 1 - n in lexicographical order.
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.
C++代码运行时间结果是720ms,25个testcase。估计是我算法太慢了,先贴出来吧。
class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> result;
int Fir_num = 1, power = 0, num = 0, limits = 0;
while (1)
{
num = Fir_num*pow(10, power);
limits = (Fir_num + 1)*pow(10, power);
while (num < n)
{
result.push_back(num);
if (result.size() == n) return result;
power++;
num = Fir_num*pow(10, power);
}
if (num == n)
{
result.push_back(num);
if (result.size() == n) return result;
}
power--;
num = Fir_num*pow(10, power) + 1;
limits = (Fir_num + 1)*pow(10, power);
while (num < n&&num<limits)
{
if (insert(result, num, limits, n, 1))
return result;
if (num == n&&n % 10 != 0)
if (insert(result, num, limits, n, INT_MAX))
return result;
}
if (num == n&&n % 10 != 0)
if (insert(result, num, limits, n, INT_MAX))
return result;
if (num > n || num == limits)
{
power = 0;
Fir_num++;
}
}
return result;
}
int insert(vector<int>& result, int &num, int &limits, int &n,int onlyonce){
int tmp = 0, tmp1 = 0, tmp2 = 0, length = 0;
result.push_back(num);
if (result.size() == n) return 1;
while (num < limits&&onlyonce)
{
onlyonce--;
tmp = num / 10;
num++;
if ((int)(num / 10) != tmp&&num < limits)
{
tmp1 = tmp;
tmp2 = num / 10;
length = 0;
while (tmp1 != tmp2)
{
length++;
tmp1 /= 10;
tmp2 /= 10;
}
while (length)
{
if (num / pow(10, length) < n)
{
result.push_back(num / pow(10, length));
if (result.size() == n) return 1;
}
tmp1 /= 10;
tmp2 /= 10;
length--;
}
}
}
return 0;
}
};