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] 也会被接受。
提示:
2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000
解题思路一
- 创建新列表B。
- 逐一取出A中符合B列表当前奇偶性的A列表数字添加到B列表。
比如数据 [4,2,5,7]
,首先是4,添加到B[0]
中,A列表变更为[2,5,7]
。其次是2,不符合要求,往后寻找第一个奇数是5,添加到B[1]
,A列表变更为[2,7]
。这个思路核心是A列表的长度是变化的,要控制好列表的下标,不要出现超限错误。
class Solution:
def sortArrayByParityII(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
i=0
B=[]
for i in range(len(A)):
if (i % 2) == A[0] % 2:
B.append(A.pop(0))
else:
j=0
while j<len(A): # A列表长度是变化的,要用while循环
if i % 2 == A[j] % 2:
B.append(A.pop(j))
break # 添加成功后,退出循环
else:
j += 1
return B
由于涉及循环嵌套,算法复杂度为 O(n2),提交后效果不好,用时在后2%。
61 / 61 个通过测试用例
执行用时:824 ms
执行用时战胜1.91%的提交记录
解题思路二
这个是看别人的思路,特别粗暴
- 将
A[]
中的偶数和奇数分别取出来,放在EvenNum[]
和OddNum[]
中。 - 依次将
EvenNum[]
和OddNum[]
中的数放入B[]
中。
class Solution:
def sortArrayByParityII(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
B=[]
EvenNum=[]
OddNum=[]
for i in range(len(A)):
if A[i] % 2 == 0:
EvenNum.append(i)
else:
OddNum.append(i)
for i in range(len(EvenNum)):
B.append(A[EvenNum[i]])
B.append(A[OddNum[i]])
return B
有两个循环,复杂度为 O(n)。提交执行用时排名在14%以内。
61 / 61 个通过测试用例
执行用时:168 ms
执行用时战胜 87.62% 的提交记录
解题思路三
这个是大神的思路,前1%。
- 创建一个和
A[]
一样长度的全零列表B[]
。 - 直接把
A[]
的元素往B[]
中填,偶数就填到偶数位,奇数就填到奇数位。
class Solution:
def sortArrayByParityII(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
i = 0
j = 1
ans = [0] * len(A)
for num in A:
if num % 2 == 0:
ans[i] = num
i += 2
else:
ans[j] = num
j += 2
return ans
这个思路更好,只用循环一次,复杂度为 O(n)。