文章目录
思路
方法1:一次遍历,遇偶存头,遇奇存尾
建立一个与nums数组相同长度的数组ret
遍历nums
遇到偶数则将其存于头部
遇到奇数则将其存于尾部
时间复杂度:O(n)
空间复杂度:O(n)
方法2:一次遍历,双指针交换
左指针指向nums中从左至右第一个奇数
右指针指向nums中从左至右第一个偶数
交换左右指针中的数值
经过上述操作,
左指针处的数值以及左指针之前的数值都是偶数
右指针处的数值以及右指针之后的数值都是奇数
左指针从自身位置向右继续寻找奇数
若找到奇数,则下一步就是找到一个偶数与之交换,这时右指针从自身位置向左寻找,若找到则交换,若遇到右指针等于左指针的情况说明当前nums已排好序
时间复杂度:O(n)
空间复杂度:O(1)
要点:
保证左指针之前的数值都是偶数
保证右指针之后的数值都是奇数
使得它们相遇时,左全为偶数,右全为奇数
方法1代码
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
*returnSize=numsSize;
int *ret=(int*)malloc(sizeof(int)*numsSize);
int left=-1,right=numsSize;
for(int i=0;i<numsSize;i++){
if(nums[i]%2==0){ //num[i]为偶数
ret[++left]=nums[i];
}
else{ //num[i]为奇数
ret[--right]=nums[i];
}
}
return ret;
}