[路飞]_6000.对奇偶下标分别排序

251 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

6000. 对奇偶下标分别排序

描述

给你一个下标从 0 开始的整数数组 nums 。根据下述规则重排 nums 中的值:

  • 按 非递增 顺序排列 nums 奇数下标 上的所有值。
    • 举个例子,如果排序前 nums = [4,1,2,3] ,对奇数下标的值排序后变为 [4,3,2,1] 。奇数下标 1 和 3 的值按照非递增顺序重排。
  • 按 非递减 顺序排列 nums 偶数下标 上的所有值。
    • 举个例子,如果排序前 nums = [4,1,2,3] ,对偶数下标的值排序后变为 [2,1,4,3] 。偶数下标 0 和 2 的值按照非递减顺序重排。 返回重排 nums 的值之后形成的数组。

示例1

输入:nums = [4,1,2,3]
输出:[2,3,4,1]
解释:
首先,按非递增顺序重排奇数下标(1 和 3)的值。
所以,nums 从 [4,1,2,3] 变为 [4,3,2,1] 。
然后,按非递减顺序重排偶数下标(0 和 2)的值。
所以,nums 从 [4,1,2,3] 变为 [2,3,4,1] 。
因此,重排之后形成的数组是 [2,3,4,1]

题解

  • 枚举 numsnums 将奇数下标元素放在 leftleft 数组中
  • 枚举 numsnums 将偶数下标元素放在 rightright 数组中
  • 对数组 leftleft 按非递增顺序
  • 对数组 rightright 按非递减顺序,
  • 双指针合并数组 leftleftrightright 将元素放入 numsnums 合适位置
  • 返回结果即可

时间复杂度:O(nLog(n))O(nLog(n))

刚遇到这题时我以为会有别的解题思路,但是竞赛中优先AC,赛后发现大多数同学跟我的思路一致。暂时作者也没有更好的思路,如你有好的思路请评论区留言讨论

根据上述思路编辑代码如下

代码

var sortEvenOdd = function (nums) {
  const len = nums.length
  if (len < 3) return nums
  let left = []
  let right = []
  for (let i = 0; i < len; i++) {
    if (i % 2 === 1) {
      left.push(nums[i])
    } else {
      right.push(nums[i])
    }
  }
  left.sort((a, b) => b - a)
  right.sort((a, b) => a - b)
  let l = 0
  let r = 0
  for (let i = 0; i < len; i++) {
    if (i % 2 === 1) {
      nums[i] = left[l]
      l++
    } else {
      nums[i] = right[r]
      r++
    }
  }
  return nums
}