如果长度为 n
的数组 nums
满足下述条件,则认为该数组是一个 漂亮数组 :
nums
是由范围[1, n]
的整数组成的一个排列。- 对于每个
0 <= i < j < n
,均不存在下标k
(i < k < j
)使得2 * nums[k] == nums[i] + nums[j]
。
给你整数 n
,返回长度为 n
的任一 漂亮数组 。本题保证对于给定的 n
至少存在一个有效答案。
示例 1 :
输入:n = 4 输出:[2,1,4,3]
示例 2 :
输入:n = 5 输出:[3,1,2,5,4]
提示:
1 <= n <= 1000
方法一:分治
根据题意,漂亮数组
我们可以发现,不等式左侧一定是偶数,那么我们只要保证不等式右侧
利用分治,我们将
基于一个性质,将漂亮数组中的每个元素
$x_i$ 变换为$kx_i+b$ ,得到的数组仍然是漂亮数组。
将这两个漂亮数组合并在一起,由于满足一奇一偶,那么合并后的数组也是漂亮数组,从而得到了答案。
时间复杂度
class Solution:
def beautifulArray(self, n: int) -> List[int]:
if n == 1:
return [1]
left = self.beautifulArray((n + 1) >> 1)
right = self.beautifulArray(n >> 1)
left = [x * 2 - 1 for x in left]
right = [x * 2 for x in right]
return left + right
class Solution {
public int[] beautifulArray(int n) {
if (n == 1) {
return new int[] {1};
}
int[] left = beautifulArray((n + 1) >> 1);
int[] right = beautifulArray(n >> 1);
int[] ans = new int[n];
int i = 0;
for (int x : left) {
ans[i++] = x * 2 - 1;
}
for (int x : right) {
ans[i++] = x * 2;
}
return ans;
}
}
class Solution {
public:
vector<int> beautifulArray(int n) {
if (n == 1) return {1};
vector<int> left = beautifulArray((n + 1) >> 1);
vector<int> right = beautifulArray(n >> 1);
vector<int> ans(n);
int i = 0;
for (int& x : left) ans[i++] = x * 2 - 1;
for (int& x : right) ans[i++] = x * 2;
return ans;
}
};
func beautifulArray(n int) []int {
if n == 1 {
return []int{1}
}
left := beautifulArray((n + 1) >> 1)
right := beautifulArray(n >> 1)
var ans []int
for _, x := range left {
ans = append(ans, x*2-1)
}
for _, x := range right {
ans = append(ans, x*2)
}
return ans
}