题目描述
给定一个数字,找出比这个数字大的最小数,其中这个数字是由给定数字的数位组成的;若找不到,则返回-1。
如给定数字123,则由数字123的所有数位可组成数字123、132、213、231、321、312,这些数字里比给定数字123大的最小数是132
样例
样例1
样例输入
12
样例输出
21
样例2
样例输入
123
样例输出
132
样例3
样例输入
321
样例输出
-1
题解
class solation
{
private:
std::vector<int> nums;
std::vector<int> path;
std::vector<int> used;
int res=-1;
public:
void getNums(int N)
{
while(N>0)
{
nums.emplace_back(N%10);
N=N/10;
}
int s=0,e=nums.size()-1;
while(s<e)
{
int temp=nums[s];
nums[s]=nums[e];
nums[e]=temp;
s++;
e--;
}
used.insert(used.begin(),nums.size(),0);
}
void backing(int N)
{
if(path.size()==nums.size())
{
int n=0;
for(int i=0;i<path.size();i++)
{
n=n*10+path[i];
}
// std::cout<<n<<std::endl;
if(n > N && (res == -1 || n < res))
{
res = n;
}
}
for(int i=0;i<nums.size();i++)
{
if(used[i]==1) continue;
used[i]=1;
path.emplace_back(nums[i]);
backing(N);
path.pop_back();
used[i]=0;
}
}
int sol(int N)
{
getNums(N);
backing(N);
return res;
}
};