Leetcode 922. 按奇偶排序数组 II

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

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

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

 

示例:

输入:[4,2,5,7]

输出:[4,5,2,7]

解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

 

提示:

  1. 2 <= A.length <= 20000
  2. A.length % 2 == 0
  3. 0 <= A[i] <= 1000

 

**难度**: Easy

**标签**: 排序、 数组、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:244 ms, 在所有 Python3 提交中击败了79.21% 的用户
内存消耗:15.8 MB, 在所有 Python3 提交中击败了21.67% 的用户

解题思路:
    单次遍历
"""
class Solution:
    def sortArrayByParityII(self, A: List[int]) -> List[int]:
        num = 0
        i = 0
        while i < len(A):
            if A[i] % 2 == i % 2:   # 如果当前奇偶排序对应,则下一个元素
                i += 1
            else:
                while i+num < len(A) and A[i+num] % 2 != i % 2: # 找下一个满足奇偶排序的元素,并用num记录下标
                    num += 1
                A[i], A[i+num] = A[i+num], A[i] # 交换满足奇偶排序的项
                num -= 1    # 记录下标减1
                i += 1 # 处理下一个元素
        return A

"""
执行用时:232 ms, 在所有 Python3 提交中击败了91.19% 的用户
内存消耗:15.9 MB, 在所有 Python3 提交中击败了13.33% 的用户

解题思路:
    具体实现见代码注释
"""
class Solution(object):
    def sortArrayByParityII(self, A):
        j = 1
        for i in range(0, len(A), 2):
            if A[i] % 2:    # 处理奇数下标
                while A[j] % 2: # 找偶数下标j对应的偶数
                    j += 2
                A[i], A[j] = A[j], A[i] # 交换i,j对应元素
        return A