• 324. 摆动排序 II


    分析

    该题属于非常规题目,在以前属于Hard难度(近期改成了Medium),属于有些大公司喜欢考察拉开差距的题目。该题有两种解法,一种时间复杂度较高,但容易理解,另一种时间复杂度较低,但难一些理解。

    正解做法

    首先讲解答案的做法,再去证明它的有效性。假设有数组,经过 O ( n l o g n ) O(nlogn) O(nlogn)时间排序后,得到[1,1,1,5,6],我们将其分为等长的两部分,[1,1,1]和[5,6]。然后,倒序从两部分取数,得到[1,6,1,5,1]。当数组数量为偶数时,这个做法不变。
    什么时候问题有解?

    • 当数组里元素最多重复的次数小于等于 ⌊ n / 2 ⌋ \left \lfloor n/2 \right \rfloor n/2时,该问题有解,用上文做法一定能找到解。
    • 然后有个特殊情况,当数组数量为奇数,最多重复次数为 ⌈ n / 2 ⌉ \left \lceil n/2 \right \rceil n/2,且重复元素是最小值时,比如[1,1,1,5,6],问题也有解。
    • 否则问题无解。
      • 条件2的其它情况满足,但重复的元素并非最小值时,比如数组是[1,1,5,5,5]时,该数组无解。
      • 如果重复次数过多,比如数组是[1,5,5,5],该数组也无解。
      • 留意到,如果数组数量为偶数,且重复次数为 ⌈ n / 2 ⌉ \left \lceil n/2 \right \rceil n/2,此时满足条件1,仍然是有解的。

    下文需要证明:

    1. 为什么最多元素重复次数≤ ⌊ n / 2 ⌋ \left \lfloor n/2 \right \rfloor n/2时,用该做法一定有解?
    2. 为什么最多元素重复次数= ⌈ n / 2 ⌉ \left \lceil n/2 \right \rceil n/2,数组数为奇数个,且重复元素是最小值时,问题仍然有解?
    3. 为什么最多元素重复次数≥ ⌈ n / 2 ⌉ \left \lceil n/2 \right \rceil n/2,却不满足条件2时,数组无解?

    证明1

    分为数组数量为偶数和奇数的情况讨论。
    假如数组数量为偶数,比如[1,1,1,5,6,7],分为[1,1,1]和[5,6,7]两部分。假如取x[i]为arr[a],且x[i+1]>x[i],则x[i+1]为arr[a+n/2]。

    • 后者在前者的右侧,且数组有序,所以后者一定大于或等于前者
    • 假如两个元素相等,结合数组有序的特征,它们中间的数也一定相等,那么重复次数为n/2+1次,与题设相悖。所以后者一定不等于前者

    综上,后者一定大于前者。所以这种取法能满足需求。

    而取x[i+2]时,为了维持x[i+2] 以此类推,我们能证明x[0]x[2],…所以该做法一定合法。

    假如数组数量为奇数,分为两组后同理也可证该做法合法,因为较小一组的元素数为 ⌊ n / 2 ⌋ \left \lfloor n/2 \right \rfloor n/2,所以任取x[i]与x[i+1],在原数组中的跨度也至少是 ⌊ n / 2 ⌋ \left \lfloor n/2 \right \rfloor

  • 相关阅读:
    大数据在电力行业的应用案例100讲(二十九)-数据水印在电网企业中提供的有效帮助
    会员营销中,沉寂会员的三种运营策略
    解释 Git 的基本概念和使用方式
    前后端通信 —— HTTP/HTTPS
    <计算机网络自顶向下>
    路由与交换技术-17-生成树协议配置
    LeetCode - 反转链表Ⅱ
    【IoT】产品认证:国密认证中的委托人、生产者、生产企业是什么意思?
    实时 Path Tracing 实现
    在移动硬盘安装 Ubuntu
  • 原文地址:https://blog.csdn.net/duoyasong5907/article/details/127063568