题目:按奇偶排序数组 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] 也会被接受。
提示:
- 2 <= A.length <= 20000
- A.length % 2 == 0
- 0 <= A[i] <= 1000
来源:力扣(LeetCode)第922题
分析:
一遍遍历数组即可求解。但是为了追求极致,采用双指针法可以实现原地交换。
思路:
- 使用两个指针
i
,j
。 - 一个遍历偶数下标,一个遍历奇数下标。
- 如果
i
在偶数的下标中找到了一个奇数,那么就从j
奇数下标中找一个偶数。 - 将两者交换位置。
代码:
双指针法:
class Solution: def sortArrayByParityII(self, A: List[int]) -> List[int]: j = 1 for i in range(0, len(A), 2): if A[i] % 2 == 1: while A[j] % 2 == 1: j += 2 A[i], A[j] = A[j], A[i] return A
正常一次遍历:
class Solution: def sortArrayByParityII(self, A: List[int]) -> List[int]: ans = [0 for _ in range(len(A))] single = 1 double = 0 for i in range(len(A)): if A[i] % 2 == 0: ans[double] = A[i] double += 2 else: ans[single] = A[i] single += 2 return ans
复杂度分析:
- 双指针法:
- 时间复杂度:O(n) n 为数组长度
- 空间复杂度:O(1)
- 正常遍历:
- 时间复杂度:O(n) n 为数组长度
- 空间复杂度:O(n)
总结:
- 双指针法可以降低空间的使用,用过原地交换实现不需要额外的空间去储存答案。