双指针

题目链接-来源:力扣(LeetCode)

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。

思路:

我们的目标是让数组「左侧」全是奇数,如果暴力解的话,那么我们就从头遍历数组,碰到偶数的话,从尾部反向遍历数组,寻找第一个奇数进行交换。
但实际上,我们很容易想到优化的方案:
经过交换的尾部数组已经符合要求,我们不需要每次都从末尾开始查找奇数,只要从上一次落脚点查找就可以了,于是想到双指针法。
一个指针 left 从左侧开始查找偶数,另一个指针 right 从右侧开始查找奇数,都找到以后进行交换即可。指针移动过程中需要时刻保持 left < right。
时间复杂度:O(n)
空间复杂度:O(1)

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int[] exchange(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
while (left < right && (nums[left] & 1) == 1) {
left++;
}
while (left < right && (nums[right] & 1) == 0) {
right--;
}
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
return nums;
}
}