LeetCode 932. Beautiful Array解题报告(python)

探讨了LeetCode上一道有趣的题目——美丽数组。通过分析其特性,发现了一个优雅的解决方案,即通过奇数和偶数的交织排列来构建数组,确保了任意两个元素之间不存在它们的平均数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

932. Beautiful Array

  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值