解题思路:首尾双指针
算法思路:
- 定义头指针 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)
