算法刷题 - 双指针(按照奇数偶数排序数组)

89 阅读1分钟

原题链接

LeetCode 905 - 按照奇数偶数排序数组

题目描述

给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 返回满足此条件的 任意数组 作为答案。

输入示例

输入示例

思路

双指针 —— 对撞(相向)指针

  1. 左指针 left指向数组起始位置,右指针 right 指向数组右边界
  2. 当左指针位置在右指针左侧的时候,左指针不断右移直到找到奇数
  3. 当左指针位置子在右指针左侧的时候,右指针不断左移直到找到偶数
  4. 交换左右指针所指向的元素后,左右指针分别靠近一位
  5. 直到左右指针相遇

代码

class Solution {
    public int[] sortArrayByParity(int[] nums) {
        if (null == nums || nums.length == 1) {
            return nums; // 检查输入
        }
        int l = 0, r = nums.length - 1;
        while (l < r) {
            while (l < r && nums[l] % 2 == 0) {
                l++;
            }
            while (l < r && nums[r] % 2 != 0) {
                r--;            
            }
            if (l < r) {
                swap(l, r, nums); // 交换之后更新对撞指针
            }
            l++;
            r--;
        }
        return nums;
    }
    
    //交换数组位置
    private void swap(int l, int r, int[] nums) {
        int tmp = nums[l];
        nums[l] = nums[r];
        nums[r] = tmp;
    }
}

结果分析

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

面试/笔试记录

    1. 中金国际 - 笔试题 ✔ [输入方式: ACM 模式 无输入输出]