按奇偶排序数组 II

标签: 数组 双指针 排序

难度: Easy

给定一个非负整数数组 nums,  nums 中一半整数是 奇数 ,一半整数是 偶数

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数

你可以返回 任何满足上述条件的数组作为答案

示例 1:

输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

示例 2:

输入:nums = [2,3]
输出:[2,3]

提示:

  • 2 <= nums.length <= 2 * 104
  • nums.length 是偶数
  • nums 中一半是偶数
  • 0 <= nums[i] <= 1000

进阶:可以不使用额外空间解决问题吗?

Submission

运行时间: 24 ms

内存: 17.9 MB

class Solution:
    def sortArrayByParityII(self, nums: List[int]) -> List[int]:
        a=[]
        b=[]
        d=[]
        for i in nums:
            if i%2==0:
                a.append(i)
            else:
                b.append(i)
        for m in range(len(a)):
            d.extend([a[m],b[m]])
        return d

Explain

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

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def sortArrayByParityII(self, nums: List[int]) -> List[int]:
        a = []  # 存储偶数
        b = []  # 存储奇数
        d = []  # 存储最终结果
        for i in nums:
            if i % 2 == 0:
                a.append(i)
            else:
                b.append(i)
        for m in range(len(a)):
            d.extend([a[m], b[m]])  # 交替添加奇数和偶数到结果列表
        return d

Explore

如果输入数据中奇数和偶数的数量不相等,该解法将不再有效。在题解的实现中,使用了两个列表分别存储奇数和偶数,并在之后的循环中假设这两个列表长度相等,通过同样的索引来交替添加元素至结果列表。如果奇数和偶数的数量不相等,将会导致在某一点上,一个列表的元素已经取完,而另一个列表中还有剩余元素,这将导致索引错误或结果数组长度不符合题目要求。

使用题解中的方法,原数组中奇数和偶数的相对顺序将会被保留。这是因为奇数和偶数分别被添加到各自的列表中,并且是按照它们在原数组中出现的顺序进行添加的。在构建最终结果数组时,也是按照奇数和偶数列表中的顺序依次取出元素。因此,每种类型的数(奇数或偶数)在最终数组中的顺序将与它们在原始数组中的顺序相同。

在实现中选择使用extend方法而非append的主要原因是减少代码的复杂度和提高可读性。使用extend方法可以一次性添加两个元素(一个奇数和一个偶数),使得代码更加简洁。如果使用append,需要连续调用两次,代码可能会显得更繁琐。然而,从性能角度来看,extend和连续两次append在这种情况下的差异非常小,因为extend本质上也是在内部循环中逐个添加元素。因此,选择extend更多是为了代码的简洁性。