題目來(lái)源:https://leetcode-cn.com/problems/sort-array-by-parity-ii/
給定一個(gè)非負(fù)整數(shù)數(shù)組 A, A 中一半整數(shù)是奇數(shù)藻烤,一半整數(shù)是偶數(shù)想帅。
對(duì)數(shù)組進(jìn)行排序膝迎,以便當(dāng) A[i] 為奇數(shù)時(shí)析恢,i 也是奇數(shù)液样;當(dāng) A[i] 為偶數(shù)時(shí)铐达, i 也是偶數(shù)岖赋。
你可以返回任何滿(mǎn)足上述條件的數(shù)組作為答案。
示例:
輸入:[4,2,5,7]
輸出:[4,5,2,7]
解釋?zhuān)篬4,7,2,5]瓮孙,[2,5,4,7]唐断,[2,7,4,5] 也會(huì)被接受。
提示:
2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000
思路:
由于沒(méi)有規(guī)定返回?cái)?shù)組的順序杭抠,一個(gè)很自然的想法就是開(kāi)輸入數(shù)組長(zhǎng)度的空間脸甘,遍歷給定數(shù)組,再根據(jù)是奇數(shù)還是偶數(shù)按順序賦值祈争。時(shí)間復(fù)雜度和空間復(fù)雜度都是O(n)斤程。
class Solution:
def sortArrayByParityII(self, A: List[int]) -> List[int]:
nums = [0] * len(A)
oddIndex = 1
evenIndex = 0
for i in range(len(A)):
if A[i] % 2 == 0:
nums[evenIndex] = A[i]
evenIndex += 2
else:
nums[oddIndex] = A[i]
oddIndex += 2
return nums
一個(gè)更簡(jiǎn)單的思路是用雙指針遍歷數(shù)組,遇到滿(mǎn)足條件的數(shù)字跳過(guò),直到兩個(gè)指針都遇到不滿(mǎn)足條件的數(shù)字忿墅,然后交換這兩個(gè)數(shù)扁藕,繼續(xù)遍歷。這樣做不需要?jiǎng)?chuàng)建額外空間疚脐。
class Solution:
def sortArrayByParityII(self, A: List[int]) -> List[int]:
i = 0
j = 1
while True:
while i < len(A) and A[i] % 2 == 0:
i += 2
while j < len(A) and A[j] % 2 == 1:
j += 2
if i <= len(A) and j <= len(A):
A[i], A[j] = A[j], A[i]
i += 2
j += 2
else:
return A