dfs全排列是我写的,数学的看不懂,也不想看!
class Solution {
public:
// void dfs(int n, int k,vector<int> tmp){
// if(res.size() != 0) return;
// if(tmp.size() == n){
// unordered_set<int> qujian;
// for(int i = 0; i < tmp.size()-1; ++i){
// //unordered_set是insert的
// qujian.insert(abs(tmp[i]-tmp[i+1]));
// }
// if(qujian.size() == k){
// res = tmp;
// }
// return;
// }
// for(int i = 1; i <= n; ++i){
// if(find(tmp.begin(),tmp.end(),i) == tmp.end()){
// tmp.push_back(i);
// dfs(n,k,tmp);
// tmp.pop_back();
// }
// }
// }
vector<int> constructArray(int n, int k) {
//区间问题=贪心
//dfs爆搜,通过find来确定是否要加入这个元素,最后tmp数组满了之后组成绝对值数组
//判断这个绝对值数组有几个不同的值
// vector<int> tmp;
// dfs(n,k,tmp);
// return res;
//排列组合时间复杂度太高了,O(2^n)
assert(n > 0 && k > 0);
vector<int> res;
int i = 1;
int j = n;
while (i <= j) {
if (k > 1) {
// 按照交替i,j一小一大的方法生成前K-1个数
if (k % 2 != 0) {
res.push_back(i);
i++;
} else {
res.push_back(j);
j--;
}
k--;
} else {
// 按照生序的方法生成剩余排列
res.push_back(i);
i++;
}
}
return res;
}
// private:
// vector<int> res;
};