题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
思路
使用首尾双指针法
,头指针从左向右循环寻找偶数,尾指针从右向左循环寻找奇数,然后将两者交换,循环进行直到违反循环条件left<right
。
题解
C++
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
while ((nums[left] & 1) != 0 && left < right) left++; /*此处left++与++left并无区别*/
while ((nums[right] & 1) != 1 && left < right) right--;
swap(nums[left], nums[right]);
}
return nums;
}
};
注意点:
- swap函数竟然不需要引包
- 循环条件
left<right
比较精妙。仔细分析,两个指针不一定会指向同一个元素,若循环条件设为left != right
会导致一些bug - 在寻找奇(偶)数注意需要同时两个条件。程序刚开始运行时,靠
(nums[left] & 1) != 0
终止循环。在运行一段时间后,靠left < right
终止循环
Java
class Solution {
public int[] exchange(int[] nums) {
int left = 0, right = nums.length - 1, temp;
while(left < right){
while((nums[left] & 1) == 1 && left < right) left++;
while((nums[right] & 1) == 0 && left < right) right--;
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
return nums;
}
}
复杂度
时间复杂度 | 空间复杂度 |
---|---|
O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) |
内外双循环,因而时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
不断重复使用临时变量temp,因而空间复杂度为
O
(
1
)
O(1)
O(1)