sort仿函数解法
class Solution {
public:
static bool cmp(int a,int b){
string A="";
string B="";
A+=to_string(a);
A+=to_string(b);
B+=to_string(b);
B+=to_string(a);
return A<B;
}
string PrintMinNumber(vector<int> numbers) {
string answer="";
sort(numbers.begin(),numbers.end(),cmp);
for(int i=0;i<numbers.size();i++){
answer+=to_string(numbers[i]);
}
return answer;
}
};
全排列深搜解法
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Solution
{
private:
vector<string> res;
int len;
bool jianzhi(string str1, string str2) {
for (int i = 0; i < str1.size(); ++i) {
if (str1[i] > str2[i]) {
return true;
}
}
return false;
}
void dfs(const vector<int>& rawData, vector<bool>& flag, int index, int& cnt, string ret)
{
cout << "index = " << index << " " << rawData[index] << " " << flag[index] << endl;
if (flag[index]) {
return;
}
//sort(res.begin(), res.end()); // 剪枝
//if (res.size() > 0 && jianzhi(ret, res[0])) {
// return;
//}
cnt++;
flag[index] = true;
ret += to_string(rawData[index]);
if (cnt == len) {
res.push_back(ret);
//cnt--; // 加上这三行,可以在最后少调一次dfs, 三个元素的时候,少调18次。
//flag[index] = false;
//return;
}
for (int j = 0; j < len; ++j) {
dfs(rawData, flag, j, cnt, ret);
}
cnt--;
flag[index] = false;
}
public:
string getMinString(const vector<int>& rawData)
{
len = rawData.size();
int cnt = 0;
vector<bool> flag(len);
string ret;
for (int i = 0; i < len; ++i) {
cout << " --------------" << endl;
dfs(rawData, flag, i, cnt, ret);
}
sort(res.begin(), res.end());
for (int i = 0; i < res.size(); ++i)
{
cout << "res[" << i << "] = " << res[i] << endl;
}
return res[0];
}
};
int main()
{
vector<int> test = { 3, 45, 678 };
Solution s;
cout << "结果为:" << s.getMinString(test);
system("pause");
}