jaryue
2023/05/24阅读:8主题:默认主题
leetcode 905. 按奇偶排序数组
题目描述
-
按奇偶排序数组
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。
示例 1:
输入:nums = [3,1,2,4] 输出:[2,4,3,1] 解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。 示例 2:
输入:nums = [0] 输出:[0]
提示:
1 <= nums.length <= 5000 0 <= nums[i] <= 5000
解题思路
法1
记录拼接法\
1.使用两个数组分别记录奇数和偶数
-
循环遍历数组,将数据记录在奇数数组与偶数数组中
-
最后拼接输出结果数组
-
时间复杂度(O(n)) -
空间复杂度(O(n))
法2
方法2:双指针\
-
两个指针分别指向头节点与尾节点
-
当尾节点为偶数,头节点为奇数时,交换位置
最后输出该数组
-
时间复杂度(O(n)) -
空间复杂度(O(1))
执行结果
法1
略
法2
我们使用两个指针 left 和 right 分别指向数组的开头和末尾。通过迭代比较指针位置的元素,我们可以将偶数元素移到数组的前面,奇数元素移到数组的后面。
具体的操作如下:
如果左指针指向偶数,右指针指向奇数,则左指针右移一位,右指针左移一位。
如果左指针指向奇数,右指针指向偶数,则交换左右指针位置的元素,并将左指针右移一位,右指针左移一位。
如果左指针指向偶数,右指针也指向偶数,则左指针右移一位。
如果左指针指向奇数,右指针也指向奇数,则右指针左移一位。
最终,当左指针大于等于右指针时,所有的偶数元素都已经移动到了数组的前面,而奇数元素则移动到了数组的后面。
left := 0
right := len(nums) - 1
for left < right {
// 左指针指向偶数,右指针指向奇数
if nums[left]%2 == 0 && nums[right]%2 != 0 {
left++
right--
} else if nums[left]%2 != 0 && nums[right]%2 == 0 { // 左指针指向奇数,右指针指向偶数
nums[left], nums[right] = nums[right], nums[left]
left++
right--
} else if nums[left]%2 == 0 && nums[right]%2 == 0 { // 左指针指向偶数,右指针也指向偶数
left++
} else { // 左指针指向奇数,右指针也指向奇数
right--
}
}
return nums
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 8 ms , 在所有 Go 提交中击败了 69.23% 的用户 内存消耗: 4.6 MB , 在所有 Go 提交中击败了 100.00% 的用户 通过测试用例: 285 / 285 炫耀一下:
作者介绍