「这是我参与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] 。
题解
- 枚举 将奇数下标元素放在 数组中
- 枚举 将偶数下标元素放在 数组中
- 对数组 按非递增顺序
- 对数组 按非递减顺序,
- 双指针合并数组 , 将元素放入 合适位置
- 返回结果即可
时间复杂度:
刚遇到这题时我以为会有别的解题思路,但是竞赛中优先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
}