932. Beautiful Array
- Beautiful Array python solution
题目描述
For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, …, N, such that:
For every i < j, there is no k with i < k < j such that A[k] * 2 = A[i] + A[j].
Given N, return any beautiful array A. (It is guaranteed that one exists.)
解析
题目的意思是给出从1到N的数组的一个排列,使得任意两个数字之间不存在他们的平均数。
观察beautiful数列,会发现它含有三个性质
1 beautiful数列中删除任意元素仍为beautiful数列
2 beautiful数列乘上一个数仍为beautiful数列
3 beautiful数列加上一个数仍为beautiful数列
2*A[K]!=A[I]+A[J]
A[k]左边全部为奇数,A[k]右边全部为偶数。这样就保证对于K位置成立!
所以我们从最简单的1开始推导,构造奇数+偶数拼接在一起成为新的数组,然后继续这个操作,就能使得得到的一直是满足条件的数组。
最后当数组的长度满足条件就结束。因为结果数组的长度是2的整数次方,
所以最后要把结果中小于等于N的留下来就行了。
先验知识,数列[1],[1,2],[1,3,2]均为beautiful 数列,所以只要按照这种排列方式线性组合,仍然产生beautiful 数列!
例如N=4
最开始的数列就是[1,2]
然后数列变为[1,3,2,4]
class Solution(object):
def beautifulArray(self, N):
res = [1]
while len(res) < N:
res = [i * 2 - 1 for i in res] + [i * 2 for i in res]
return [i for i in res if i <= N]
Reference
https://leetcode.com/problems/beautiful-array/discuss/186679/C++JavaPython-Odd-±Even-Pattern-O%28N%29