leetcode
leetcode 2651 ~ 2700
按奇偶排序数组 II

按奇偶排序数组 II

难度:

标签:

题目描述

Given an array of integers nums, half of the integers in nums are odd, and the other half are even.

Sort the array so that whenever nums[i] is odd, i is odd, and whenever nums[i] is even, i is even.

Return any answer array that satisfies this condition.

 

Example 1:

Input: nums = [4,2,5,7]
Output: [4,5,2,7]
Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted.

Example 2:

Input: nums = [2,3]
Output: [2,3]

 

Constraints:

  • 2 <= nums.length <= 2 * 104
  • nums.length is even.
  • Half of the integers in nums are even.
  • 0 <= nums[i] <= 1000

 

Follow Up: Could you solve it in-place?

代码结果

运行时间: 24 ms, 内存: 17.9 MB


解释

方法:

这个题解的思路是首先遍历原数组,将奇数和偶数分别存储在两个列表中。然后,按照题目要求,依次从两个列表中取出一个奇数和一个偶数,交替放入新的列表中,最后返回这个新列表。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
题解中假设了奇数和偶数的数量严格相等,但如果输入数据不满足这个条件(尽管题目保证了这一点),这个解法还会有效吗?
如果输入数据中奇数和偶数的数量不相等,该解法将不再有效。在题解的实现中,使用了两个列表分别存储奇数和偶数,并在之后的循环中假设这两个列表长度相等,通过同样的索引来交替添加元素至结果列表。如果奇数和偶数的数量不相等,将会导致在某一点上,一个列表的元素已经取完,而另一个列表中还有剩余元素,这将导致索引错误或结果数组长度不符合题目要求。
🦆
在题解的实现中,如果原数组中的奇数或偶数的顺序有特定的要求,使用这种方法重新排序后,原始顺序是否会被保留?
使用题解中的方法,原数组中奇数和偶数的相对顺序将会被保留。这是因为奇数和偶数分别被添加到各自的列表中,并且是按照它们在原数组中出现的顺序进行添加的。在构建最终结果数组时,也是按照奇数和偶数列表中的顺序依次取出元素。因此,每种类型的数(奇数或偶数)在最终数组中的顺序将与它们在原始数组中的顺序相同。
🦆
在实际的实现中,使用了extend方法来交替添加元素到结果列表,为什么不选择使用append方法逐个添加元素,这样做有什么优势或劣势?
在实现中选择使用extend方法而非append的主要原因是减少代码的复杂度和提高可读性。使用extend方法可以一次性添加两个元素(一个奇数和一个偶数),使得代码更加简洁。如果使用append,需要连续调用两次,代码可能会显得更繁琐。然而,从性能角度来看,extend和连续两次append在这种情况下的差异非常小,因为extend本质上也是在内部循环中逐个添加元素。因此,选择extend更多是为了代码的简洁性。

相关问题