Loading

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

题目

剑指 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)\)
posted @ 2021-10-18 21:17  linzeliang  阅读(63)  评论(0编辑  收藏  举报