Leetcode 932:漂亮陣列(最詳細的解法!!!)
阿新 • • 發佈:2018-12-18
對於某些固定的 N
,如果陣列 A
是整數 1, 2, ..., N
組成的排列,使得:
對於每個 i < j
,都不存在 k
滿足 i < k < j
使得 A[k] * 2 = A[i] + A[j]
。
那麼陣列 A
是漂亮陣列。
給定 N
,返回任意漂亮陣列 A
(保證存在一個)。
示例 1:
輸入:4
輸出:[2,1,4,3]
示例 2:
輸入:5
輸出:[3,1,2,5,4]
提示:
1 <= N <= 1000
解題思路
這個問題有一個非常美妙的數學解法。首先我們要證明漂亮陣列滿足這樣幾種性質
-
減法(減去一個數任然是漂亮陣列)
-
乘法(乘上一個數任然是漂亮陣列)
有了上面這兩個性質,我們就可以很快解決這個問題了。我們知道一個數組A
可以分為奇數部分A1
和偶數部分A2
。此時我們如果有一個漂亮陣列B
2*B-1
是一個漂亮陣列並且是奇數陣列,而2*B
也是一個漂亮陣列並且是偶數陣列。那麼我們通過2*B+2*B-1
必然可以構成任意一個漂亮陣列了。真的非常棒。
class Solution:
def beautifulArray(self, N):
"""
:type N: int
:rtype: List[int]
"""
result = [1]
while len(result) < N:
result = [i * 2 - 1 for i in result] + [i * 2 for i in result]
return [i for i in result if i <= N]
還有一種非常Hacker
的做法,使用的和上面相同的思路。
class Solution:
def beautifulArray(self, N):
"""
:type N: int
:rtype: List[int]
"""
return sorted(range(1, N + 1), key=lambda x: bin(x)[:1:-1])
reference:
如有問題,希望大家指出!!!