题目

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

思路1

  • 使用头尾双指针leftright,分别指向最左边和最右边
  • left向右移动,直到遇到了偶数停下
  • right向左移动,直到遇到了奇数停下
  • 交换left和right的值
  • 如果left大于等于right,说明调整完成

代码

class Solution {
    public int[] exchange(int[] nums) {
        int length = nums.length;
        int left = 0;
        int right = length-1;

        while (left < right) {
            // 找偶书
            while (left < right && nums[left] % 2 == 1) {
                left++;
            }
            // 找奇数
            while (right > left && nums[right] % 2 == 0) {
                right--;
            }
            // 只有在left小于right情况下才交换
            if (left < right) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                // 交换完成后顺便指针移动一下
                left++;
                right--;
            }
        }

        return nums;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

思路2

  • 使用快慢指针
  • 初始时候,两个指针都是指向最左端
  • 快指针每次前进一格,如果遇到了奇数,就喝慢指针进行交换,然后两个指针都前进一步
  • 如果两个指针在同一个位置则不进行交换

代码

class Solution {
    public int[] exchange(int[] nums) {
        int length = nums.length;
        int slow = 0;
        int fast = 0;

        while (slow < length && fast < length) {
            if (nums[fast] % 2 == 1) {
                if (fast != slow) {
                    int temp = nums[fast];
                    nums[fast] = nums[slow];
                    nums[slow] = temp;
                }
                slow++;
            }
            fast++;
        }
        return nums;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

相关文章:

  • 2021-06-14
  • 2021-10-13
  • 2022-01-25
  • 2021-11-29
  • 2021-10-31
  • 2022-12-23
  • 2021-09-09
猜你喜欢
  • 2021-07-01
  • 2021-07-23
  • 2021-06-15
  • 2022-12-23
  • 2021-08-24
  • 2021-08-31
相关资源
相似解决方案