题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
解题思路
维护两个指针,指针 i 指向数组起始位置,指针 j 指向数组末尾。如果指针 i 指向的数字是奇数,就向后移动,指针 j 指向的数字是偶数,就向前移动。如果指针 i 指向的数字是偶数,指针 j 指向的数字是奇数,就交换两个数字,直到最终指针 i 到指针 j 的后面。
算法流程:
- 1)初始化: i , j 双指针,分别指向数组 nums 左右两端;
- 2)循环交换: 当 i = j 时跳出;
- 2.1)指针 i 遇到奇数,则执行 i=i+1 跳过,直到找到偶数;
- 2.2)指针 j 遇到偶数,则执行 j=j−1 跳过,直到找到奇数;
- 2.3)指针 i 遇到偶数,指针 j 遇到奇数,则交换 nums[i] 和 nums[j] 值;
- 3)返回值: 返回已修改的 nums 数组。
复杂度分析:
时间复杂度:O(N)。N 为数组 nums 长度,双指针 i, j 共同遍历整个数组。
空间复杂度:O(1)。双指针 i, j 使用常数大小的额外空间。
代码
class Solution {
public int[] exchange(int[] nums) {
int i = 0;
int j = nums.length-1;
while(i < j){
if(nums[i]%2 != 0) i++;
else if(nums[j]%2 == 0) j--;
else if(nums[i]%2 == 0 && nums[j]%2 != 0){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
return nums;
}
}