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

作者: linzeliang

题目

剑指 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)\)

    原文创作:linzeliang

    原文链接:https://www.cnblogs.com/linzeliang1222/p/15422363.html

更多推荐

更多
这里什么都没有

近期文章

更多
文章目录

    推荐作者

    更多