题目地址: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 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000
题意:把数组排序,让奇数位置都是奇数,偶数位置都是偶数。
解法1:
直接遍历,时间复杂度:O(N),空间复杂度:O(N)。
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int len=A.size();
vector<int> ans(len,0);
int odd=1,even=0;
for(int i=0;i<len;i++){
if(A[i]%2==1){
ans[odd]=A[i];
odd+=2;
}else{
ans[even]=A[i];
even+=2;
}
}
return ans;
}
};
解法2:
不使用额外的空间开销,从前往后遍历,找到奇数位置不少奇数的数
和偶数位置不是偶数的数然后交换。
时间复杂度:O(N),空间复杂度:O(1)。
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int len=A.size();
int odd=1,even=0;
while(odd<len&&even<len){
while(even<len&&A[even]%2==0)even+=2;
while(odd<len&&A[odd]%2==1)odd+=2;
if(even<len&&odd<len)swap(A[odd],A[even]);
}
return A;
}
};