![0c0f92f1c35459ba769ce75364ba2a13.png](https://i-blog.csdnimg.cn/blog_migrate/644c29920ef834cc487141c6ce6271fe.jpeg)
给定一个非负整数数组 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)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:暴力求解,遍历一遍数组,判断当前元素是否满足要求,如果不满足,遍历后面的元素找到一个符合要求的元素与当前位置的元素进行交换。时间复杂度是O(n*n),leetcode判断超时。代码如下:
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A)
{
int len = A.size();
if(len == 0)
return A;
for(int i=0;i<len;i++)
{
if(i%2 == 0)
{
if(A[i] % 2 == 1)
{
for(int j=i+1;j<len;j++)
{
if(A[j]%2 == 0)
{
swap(A,i,j);
continue;
}
}
}
}else
{
if(A[i] % 2 == 0)
{
for(int j=i+1;j<len;j++)
{
if(A[j]%2 == 1)
{
swap(A,i,j);
continue;
}
}
}
}
}
return A;
}
void swap(vector<int> &A,int i,int j)
{
int a = A[i];
A[i] = A[j];
A[j] = a;
}
};
优化方法下次更新....
方法二:使用两个额外的数组A1和A2,分别记录偶数位置上数据出错的数组下标和奇数位置上数据出错的下标。遍历一遍数组A,得到数组A1和A2(根据题意,最后这两个数组的大小是一样的),最后再将A1和A2数组相同下标的元素对应在A中的元素进行交换。时间复杂度O(N),空间复杂度O(N)。
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A)
{
int len = A.size();
if(len == 0)
return A;
vector<int> A1;
vector<int> A2;
for(int i=0;i<len;i++)
{
if(i%2 == 0 && A[i]%2 == 1)
{
A1.push_back(i);
}
if(i%2 == 1 && A[i]%2 == 0)
{
A2.push_back(i);
}
}
for(int i=0;i<A1.size();i++)
{
swap(A,A1[i],A2[i]);
}
return A;
}
void swap(vector<int> &A,int i,int j)
{
int a = A[i];
A[i] = A[j];
A[j] = a;
}
};