LeetCode探索(70):905-按奇偶排序数组

108 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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 中的的所有偶数元素移动到数组的前面,并返回最终得到的数组。

那么,我们可以定义两个指针ij,分别指向未处理区间的左右端点。遍历数组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)

参考