mirror of https://github.com/doocs/leetcode.git
3.9 KiB
3.9 KiB
| comments | difficulty | edit_url | tags | |||
|---|---|---|---|---|---|---|
| true | 中等 | https://github.com/doocs/leetcode/edit/main/solution/0900-0999/0932.Beautiful%20Array/README.md |
|
932. 漂亮数组
题目描述
如果长度为 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
解法
方法一:分治
根据题意,漂亮数组 A 需要满足对于任意 i<k<j, A_k*2 \neq A_i+A_j。
我们可以发现,不等式左侧一定是偶数,那么我们只要保证不等式右侧 A_i 和 A_j 分别是一奇一偶,那么不等式就恒成立。
利用分治,我们将 n 缩小规模为原来的一半,递归调用,可以得到两个漂亮数组 left, right。我们将 left 中每个元素 x_i 变为 x_i*2-1 可以得到一个奇数数组;将 right 中每个元素 x_i 变为 x_i*2,可以得到一个偶数数组。这两个数组仍然是漂亮数组。
基于一个性质,将漂亮数组中的每个元素
x_i变换为kx_i+b,得到的数组仍然是漂亮数组。
将这两个漂亮数组合并在一起,由于满足一奇一偶,那么合并后的数组也是漂亮数组,从而得到了答案。
时间复杂度 O(nlogn)。
Python3
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
Java
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;
}
}
C++
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;
}
};
Go
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
}