解题思路:首尾双指针
算法思路:
- 定义头指针 left,尾指针 right
- left 一直向右移,直到它指向的数为偶数
- right 一直向左移,直到它指向的数为奇数
- 交换 nums[left] 与 nums[right],并让 left++,right—
- 重复上述操作,直至 left >= right
对一个数判断奇偶,我们可以使用位运算来优化
- 如果 num 为奇数,则有:num & 1 = 1
- 如果 num 为偶数,则有:num & 1 = 0
代码
class Solution {
public int[] exchange(int[] nums) {
// 首尾双指针
int left = 0;
int right = nums.length - 1;
while(left < right){
while(left < right && (nums[left] & 1) != 0){
left++;
}
while(left < right && (nums[right] & 1) != 1){
right--;
}
swap(nums,left++,right--);
}
return nums;
}
private static void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
复杂度分析
- 时间复杂度:O(N)
N 为 nums 数组的长度,时间复杂度为 O(N)
- 空间复杂度:O(1)
算法中使用了首尾指针 left,right 两个额外变量,空间复杂度为 O(1)