一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
题目
给你一个整数数组 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
思考
本题是今天的每日一题,难度简单。
首先是理解题意。题目会提供一个整数数组 nums
,我们需要将 nums
中的的所有偶数元素移动到数组的前面,并返回最终得到的数组。
那么,我们可以定义两个指针i
和j
,分别指向未处理区间的左右端点。遍历数组nums
,当遍历到的元素为奇数时,我们把该元素与数组的最后一个元素进行交换,可以使得数组最后一个为奇数,然后j--
,但是我们不能保证交换后的元素一定为偶数,需要再次进行检查。就这样,当遍历完数组后,返回该数组即可。
我们需要遍历数组一次,因此时间复杂度是O(n)
。
解答
方法一:原地交换
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArrayByParity = function(nums) {
let n = nums.length
for (let i = 0, j = n - 1; i < j; i++) {
if (nums[i] % 2 == 1) {
let c = nums[j]
nums[j--] = nums[i]
nums[i--] = c // i不能保证是偶数,需要再次检查
}
}
return nums
}
// console.log(sortArrayByParity([3,1,2,4])) // [ 4, 2, 1, 3 ]
// 执行用时:76 ms, 在所有 JavaScript 提交中击败了61.19%的用户
// 内存消耗:43.8 MB, 在所有 JavaScript 提交中击败了50.31%的用户
// 通过测试用例:285 / 285
复杂度分析:
- 时间复杂度:
O(n)
,其中 n 为数组 nums 的长度。只需遍历 nums 一次。 - 空间复杂度:
O(1)
。