题目
解析
一个基本的思想是:
因为2*A[k]是偶数,
如果奇数在左,偶数在右,那么(奇数+偶数)/2就是奇数,就不会等于A[k]。
但是如果左边全是奇数,右边全是偶数,也会出现问题。
因此需要利用 分治算法 对左边和右边进行处理。
由于偶数有
N
2
\frac{N}{2}
2N 个,偶数的表示方法是 2i
奇数有
N
+
1
2
\frac{N+1}{2}
2N+1 个,奇数的表示方法是 2i-1
因此分治的两个分支可以是
左边(奇数) function((N+1)/2) ,
右边 function(N/2)
再对返回的数进行还原(奇数是2i,偶数是2i-1)
由于都是线性的还原,因此原来的beautifulArray的性质保持不变
(线性的意思是加入有 2A[k]!=A[i]+A[j],那么22A[k]!=2(A[i]+A[j]))
答案
class Solution {
public:
vector<int> beautifulArray(int N) {
//递归终止条件
if(N==1){
return vector<int>(1,1);
}
//奇数在左,偶数在右
vector<int> left=beautifulArray((N+1)/2);
vector<int> right=beautifulArray(N/2);
vector<int> res;
res.clear();
for(int i=0;i<left.size();i++){
res.push_back(2*left[i]-1);
}
for(int i=0;i<right.size();i++){
res.push_back(2*right[i]);
}
return res;
}
};