方法一:用标准库中的next_permutation()进行暴力法求解:
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
if(numbers.empty()){
return NULL;
}
sort(numbers.begin(), numbers.end());
string res;
string temp;
for(int i=0;i<numbers.size();i++){
res.append(to_string(numbers[i]));
}
while(next_permutation(numbers.begin(), numbers.end())){
for(int i=0;i<numbers.size();i++){
temp.append(to_string(numbers[i]));
}
if(res.compare(temp)>0){
res = temp;
}
temp.clear();
}
return res;
}
};
方法二:特殊的排序规则;隐藏的大数问题,因此转化为字符串形式
对于两个数的相对顺序,可以通过字符串比较得出二者的相对顺序;
如mn>nm,那么结果为nm,即n应该在m的前面(再看原来m、n的相对顺序看是否需要交换);
算法思想:对于测试用例3,32,321,312
(1)比较3、32,即332>323,故32与3交换顺序; 得32,3,321,312
(2)比较3、321,即3321>3213,故3与321交换顺序,得32,321,3,312;再比较32、321,即32321>32132,故32与321交换顺序,得321,32,3,312
(3)比较3、312,即3312>3123,故3与312交换顺序,得321,32,312,3;
再比较32、312,交换,得321、312、32、3;
再比较321、312,交换,得312、321、32、3;
最后组合出整数:312321323
由于数组可能会发生溢出,故上面的比较、组合操作均为字符串形式,交换操作可以用整数;最后的返回值为字符串
代码如下:(提交显示复杂度太高)
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
for(int i = 0; i < numbers.size() - 1; i ++){
for(int j = i + 1; j > 0; j --){
if((to_string(numbers[j-1])+to_string(numbers[j]))>(to_string(numbers[j])+to_string(numbers[j-1]))){
swap(j,j-1,numbers);
}
}
}
string result;
for(int i=0;i<numbers.size();i++){
result += to_string(numbers[i]);
}
return result;
}
void swap(int a, int b, vector<int> &numbers){
int temp = numbers[a];
numbers[a] = numbers[b];
numbers[b] = temp;
}
};
int main(){
vector<int> numbers;
numbers.push_back(3);
numbers.push_back(32);
numbers.push_back(321);
numbers.push_back(312);
Solution sol;
cout<<sol.PrintMinNumber(numbers);
return 0;
}
同样的算法改成java语言,提交可以通过:
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
for(int i = 0; i < numbers.length - 1; i ++){
for(int j = i + 1; j > 0; j --){
if((numbers[j-1]+""+numbers[j]).compareTo(numbers[j]+""+numbers[j-1])>0){
swap(j,j-1,numbers);
}
}
}
String result="";
for(int i=0;i<numbers.length;i++){
result += numbers[i];
}
return result;
}
public void swap(int a, int b,int [] numbers){
int temp = numbers[a];
numbers[a] = numbers[b];
numbers[b] = temp;
}
}