题目描述

image.png

解题思路

考虑定义双指针 i , j 分列数组左右两端,循环执行:

  1. 指针 i 从左向右寻找偶数;
  2. 指针 jj从右向左寻找奇数;
  3. 将 偶数 nums[i] 和 奇数 nums[j] 交换。

可始终保证: 指针 i 左边都是奇数,指针 j 右边都是偶数
image.png
算法流程:

  • 初始化: i , j 双指针,分别指向数组 nums 左右两端;
  • 循环交换: 当 i = j 时跳出;
    • 指针 i 遇到奇数则执行 i = i + 1跳过,直到找到偶数;
    • 指针 j 遇到偶数则执行 j = j - 1 跳过,直到找到奇数;
    • 交换 nums[i] 和 nums[j] 值;
  • 返回值: 返回已修改的 nums 数组。

时间复杂度 O(N) : N 为数组 nums 长度,双指针 i, j 共同遍历整个数组。
空间复杂度 O(1) : 双指针 i, j 使用常数大小的额外空间。

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