作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址: https://leetcode.com/problems/sort-array-by-parity-ii
题目描述
Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.
Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is even.
You may return any answer array that satisfies this condition.
Example 1:
Input: [4,2,5,7]
Output: [4,5,2,7]
Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted.
Note:
- 2 <&#61; A.length <&#61; 20000
- A.length % 2 &#61;&#61; 0
- 0 <&#61; A[i] <&#61; 1000
题目大意
把一个数组重新排序&#xff0c;使得偶数位置全是偶数&#xff0c;奇数位置全是奇数。
解题方法
使用奇偶数组
直接使用两个数组分别存放奇数和偶数&#xff0c;然后结果就是在这两个里面来回的选取就好了。这种做法比较简单&#xff0c;打比赛比较适用。
时间复杂度是O(N)&#xff0c;空间复杂度是O(N)。
class Solution(object):def sortArrayByParityII(self, A):""":type A: List[int]:rtype: List[int]"""odd &#61; [x for x in A if x % 2 &#61;&#61; 1]even &#61; [x for x in A if x % 2 &#61;&#61; 0]res &#61; []iseven &#61; Truewhile odd or even:if iseven:res.append(even.pop())else:res.append(odd.pop())iseven &#61; not isevenreturn res
排序
先对A进行排序&#xff0c;使得偶数都在前面&#xff0c;奇数都在后面&#xff0c;然后每次从前从后各取一个数&#xff0c;然后放到结果里就好了。
class Solution:def sortArrayByParityII(self, A):""":type A: List[int]:rtype: List[int]"""A.sort(key &#61; lambda x : x % 2)N &#61; len(A)res &#61; []for i in range(N // 2):res.append(A[i])res.append(A[N - 1 - i])return res
时间复杂度是O(NlogN)&#xff0c;空间复杂度是O(1)。
奇偶数位置变量
先把结果数组创建好&#xff0c;然后使用奇偶数两个变量保存位置&#xff0c;然后判断A中的每个数字是奇数还是偶数&#xff0c;对应放到奇偶位置就行了。
时间复杂度是O(N)&#xff0c;空间复杂度是O(1)。
class Solution:def sortArrayByParityII(self, A):""":type A: List[int]:rtype: List[int]"""N &#61; len(A)res &#61; [0] * Neven, odd &#61; 0, 1for a in A:if a % 2 &#61;&#61; 1:res[odd] &#61; aodd &#43;&#61; 2else:res[even] &#61; aeven &#43;&#61; 2return res
时间复杂度是O(N)&#xff0c;空间复杂度是O(N)。
参考资料&#xff1a;
日期
2018 年 10 月 14 日 —— 周赛做出来3个题&#xff0c;开心
2018 年 11 月 5 日 —— 打了羽毛球&#xff0c;有点累