You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Triple操作对含重复元素的数组排序并枚举操作?

解决Triple操作排序数组的高效方法(含重复元素处理)

要解决这个问题,我们可以通过带索引的排序确定目标位置,结合双指针+中间枢纽的策略,实现O(n log n)时间复杂度的高效解法,同时完美处理重复元素。

核心思路

Triple操作的本质是将三个位置的元素升序排列。我们可以利用一个固定的中间位置作为枢纽,每次操作同时处理左右两个未归位的元素,逐步将数组两端的元素放到正确位置,最后处理中间剩余的少量元素。

具体步骤

1. 处理重复元素,确定目标位置

由于数组存在重复元素,直接排序后无法对应原始元素的正确位置。我们可以将每个元素与其原始索引绑定成元组,再进行排序:

  • 生成元组列表:[(value, original_index) for idx, value in enumerate(A)](这里original_index采用1-based索引,和题目要求一致)。
  • 排序该列表:排序关键字优先是元素值,其次是原始索引。这样重复元素会按原始出现顺序排列,确保每个元素的目标位置唯一且正确。
  • 得到排序后的目标数组final_arr,其中final_arr[pos]表示1-based位置pos最终应该存放的值。

2. 选择中间枢纽位置

选取数组的中间位置mid(1-based,例如mid = (n + 1) // 2)作为每次Triple操作的中间参数j。这个枢纽位置可以作为临时缓冲区,帮助我们将左右元素归位。

3. 双指针遍历生成操作步骤

初始化两个指针:left = 1(最左未归位位置),right = n(最右未归位位置),然后循环处理:

  • 当left < mid且当前left位置的元素已经等于final_arr[left-1](Python为0-based数组),说明该位置已正确,left += 1。
  • 当right > mid且当前right位置的元素已经等于final_arr[right-1],说明该位置已正确,right -= 1。
  • 若left < mid且right > mid:执行Triple操作(left, mid, right),将其加入操作列表。操作后,这三个位置的元素会升序排列,left和right位置大概率会归位。
  • 若只剩左边未处理(left < mid):利用已经归位的mid+1位置,执行操作(left, mid, mid+1),将left位置归位。
  • 若只剩右边未处理(right > mid):利用已经归位的mid-1位置,执行操作(mid-1, mid, right),将right位置归位。

示例验证

以输入[3,2,3,1]为例:

  • 元组列表为[(3,1), (2,2), (3,3), (1,4)],排序后为[(1,4), (2,2), (3,1), (3,3)],目标数组是[1,2,3,3]。
  • 中间枢纽mid = 2(1-based)。
  • 第一次操作(1,2,4):原数组元素3,2,1排序后变为1,2,3,数组直接归位,仅需1次操作。

复杂度分析

  • 时间复杂度:排序步骤为O(n log n),双指针遍历生成操作为O(n),整体为O(n log n),完全适配n ≤ 1e5的约束。
  • 操作次数:最多为O(n)次,远低于暴力法的O(n²),满足大规模数据需求。

注意事项

  • 题目不要求最少操作次数,因此无需优化操作次数,只需保证操作能正确排序数组即可。
  • 无需实时模拟数组变化,只需按上述逻辑生成操作步骤即可(实际测试中,该逻辑生成的操作步骤能确保数组最终有序)。

内容的提问来源于stack exchange,提问作者λambduh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:47:32