File tree Expand file tree Collapse file tree 3 files changed +115
-0
lines changed Expand file tree Collapse file tree 3 files changed +115
-0
lines changed Original file line number Diff line number Diff line change @@ -333,6 +333,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
333333- [ 0900. RLE 迭代器] ( ./problems/900.rle-iterator.md )
334334- [ 0911. 在线选举] ( ./problems/911.online-election.md ) 🆕
335335- [ 0912. 排序数组] ( ./problems/912.sort-an-array.md )
336+ - [ 0932. 漂亮数组] ( ./problems/932.beautiful-array.md ) 🆕
336337- [ 0935. 骑士拨号器] ( ./problems/935.knight-dialer.md )
337338- [ 0947. 移除最多的同行或同列石头] ( ./problems/947.most-stones-removed-with-same-row-or-column.md )
338339- [ 0959. 由斜杠划分区域] ( ./problems/959.regions-cut-by-slashes.md ) 🆕
Original file line number Diff line number Diff line change 192192 - [ 0900. RLE 迭代器] ( problems/900.rle-iterator.md )
193193 - [ 0911. 在线选举] ( ../problems/911.online-election.md ) 🆕
194194 - [ 0912. 排序数组] ( problems/912.sort-an-array.md )
195+ - [ 0932. 漂亮数组] ( ./problems/932.beautiful-array.md ) 🆕
195196 - [ 0935. 骑士拨号器] ( problems/935.knight-dialer.md )
196197 - [ 0947. 移除最多的同行或同列石头] ( ./problems/947.most-stones-removed-with-same-row-or-column.md ) 🆕
197198 - [ 0959. 由斜杠划分区域] ( ./problems/959.regions-cut-by-slashes.md ) 🆕
Original file line number Diff line number Diff line change 1+ ## 题目地址(932. 漂亮数组)
2+
3+ https://leetcode-cn.com/problems/beautiful-array/
4+
5+ ## 题目描述
6+
7+ ```
8+ 对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:
9+
10+ 对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。
11+
12+ 那么数组 A 是漂亮数组。
13+
14+
15+
16+ 给定 N,返回任意漂亮数组 A(保证存在一个)。
17+
18+
19+
20+ 示例 1:
21+
22+ 输入:4
23+ 输出:[2,1,4,3]
24+
25+
26+ 示例 2:
27+
28+ 输入:5
29+ 输出:[3,1,2,5,4]
30+
31+
32+
33+ 提示:
34+
35+ 1 <= N <= 1000
36+
37+
38+ ```
39+
40+ ## 前置知识
41+
42+ - 分治
43+
44+ ## 公司
45+
46+ - 暂无
47+
48+ ## 思路
49+
50+ 由数字的奇偶特性,可知:** 奇数 + 偶数 = 奇数** 。
51+
52+ 因此如果要使得:** 对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[ k] \* 2 = A[ i] + A[ j] ** 成立,我们可以令 A[ i] 和 A[ j] 一个为奇数,另一个为偶数即可。
53+
54+ 另外还有两个非常重要的性质,也是本题的突破口。那就是:
55+
56+ 性质 1: 如果数组 A 是 漂亮数组,那么将 A 中的每一个数 x 进行 kx + b 的映射,其仍然为漂亮数组。其中 k 为不等于 0 的整数, b 为整数。
57+ 性质 2:如果数组 A 和 B 分别是不同奇偶性的漂亮数组,那么将 A 和 B 拼接起来仍为漂亮数组。
58+
59+ 举个例子。我们要求长度为 N 的漂亮数组。那么一定是有 N / 2 个偶数 和 N - N / 2 个奇数。
60+
61+ > 这里的除法为地板除。
62+
63+ 假设长度为 N / 2 和 N - N/2 的漂亮数组被计算出来了。那么我们只需要对长度为 N/2 的漂亮数组通过性质 1 变换成全部为偶数的漂亮数组,并将长度为 N - N/2 的漂亮数组也通过性质 1 变换成全部为奇数的漂亮数组。接下来利用性质 2 将其进行拼接即可得到一个漂亮数组。
64+
65+ 刚才我们** 假设长度为 N / 2 和 N - N/2 的漂亮数组被计算出来了** ,实际上我们并没有计算出来,那么其实可以用同样的方法来计算。其实就是分治,将问题规模缩小了,问题本质不变。递归的终点自然是 N == 1,此时可直接返回 [ 1] 。
66+
67+ ## 关键点
68+
69+ - 利用性质** 奇数 + 偶数 = 奇数**
70+ - 对问题进行分解
71+
72+ ## 代码
73+
74+ - 语言支持:Python3
75+
76+ Python3 Code:
77+
78+ ``` python
79+
80+ class Solution :
81+ def beautifulArray (self , N : int ) -> List[int ]:
82+ @lru_cache (None )
83+ def dp (n ):
84+ if n == 1 :
85+ return [1 ]
86+ ans = []
87+ # [1,n] 中奇数比偶数多1或一样
88+ for a in dp(n - n // 2 ):
89+ ans += [a * 2 - 1 ]
90+ for b in dp(n // 2 ):
91+ ans += [b * 2 ]
92+ return ans
93+
94+ return dp(N)
95+
96+ ```
97+
98+ ** 复杂度分析**
99+
100+ 令 n 为数组长度。
101+
102+ - 时间复杂度:$O(nlogn)$
103+ - 空间复杂度:$O(n + logn)$
104+
105+ > 此题解由 [ 力扣刷题插件] ( https://leetcode-pp.github.io/leetcode-cheat/?tab=solution-template ) 自动生成。
106+
107+ 力扣的小伙伴可以[ 关注我] ( https://leetcode-cn.com/u/fe-lucifer/ ) ,这样就会第一时间收到我的动态啦~
108+
109+ 以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
110+
111+ 关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
112+
113+ ![ ] ( https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg )
You can’t perform that action at this time.
0 commit comments