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

本文介绍了在给定整数数组中交换所有偶数和奇数元素的三种算法实现,包括使用两个辅助向量、首尾指针和快慢指针的方法。每种方法的时间复杂度均为O(n),空间复杂度分别为O(n)和O(1)。通过这些方法,可以有效地重新排列数组中的奇偶元素。
摘要由CSDN通过智能技术生成

问题描述:

在这里插入图片描述

提示:这里描述项目中遇到的问题:


解题分析:

方法一:利用2个辅助vector,先遍历一遍nums,偶数的放一个 vector,奇数的放一个vector,然后再拼接

话不多说,拿到题目,第一个想到的方法,不要太简单

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        if(nums.size()<=1)
        {
            return nums;
        }
        vector<int>A,B;
        //A为偶数 B为奇书
        for(auto i=nums.begin();i!=nums.end();i++)
        {
            if(*i %2==0)
            {
                A.push_back(*i);
            }
            else
            {
                B.push_back(*i);
            }
        }
        while(!A.empty())
        {
            int a=A.back();
            B.push_back(a);
            A.pop_back();
        }
        return B;

    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

方法二:首尾指针

i 和 j i和j ij来表示2个指针,分别代表nums[i] 和nums[j]
i指向数组首部,j指向数组尾部,i永远都在j的前面
那么就有4种情况

1. n u m s [ i ] nums[i] nums[i]表示偶数, n u m s [ j ] nums[j] nums[j]表示偶数。j往前移,j–
2. n u m s [ i ] nums[i] nums[i]表示奇数, n u m s [ j ] nums[j] nums[j]表示偶数。i往后走,i++
3. n u m s [ i ] nums[i] nums[i]表示奇数, n u m s [ j ] nums[j] nums[j]表示奇数。i往后走,i++
4. n u m s [ i ] nums[i] nums[i]表示偶数, n u m s [ j ] nums[j] nums[j]表示奇数。交换

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        if(nums.size()==0)//首尾指针
        {
            return nums;
        }
        int i=0;
        int j=nums.size()-1;
        int temp;
        while(i<j)
        {
            if(nums[i]%2==0 && nums[j]%2==0)
            {
                j--;
            }
            else if(nums[i]%2!=0 && nums[j]%2==0)
            {
                i++;
            }
            else if(nums[i]%2!=0 && nums[j]%2!=0)
            {
                i++;
            }
            else 
            {
                temp=nums[i];
                nums[i]=nums[j];
                nums[j]=temp;
            }
        }
        return nums;
    }
};

在这里插入图片描述
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

方法三:快慢指针

  • 分别定义快慢指针为fast ,slow.都指向数组首部
  • fast 一步一步往后移,若遇到奇数就和slow交换,交换后slow++,表示左边加了个奇数
  • fast若没有遇到奇数,就一直后移,直到到达数组尾部
class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        if(nums.size()==0)//快慢指针
        {
            return nums;
        }
        int fast=0,slow=0;
        while(fast<nums.size())
        {
            if(nums[fast]%2!=0)
            {
                int t=nums[fast];
                nums[fast]=nums[slow];
                nums[slow]=t;
                slow++;
            }
            fast++;
        }
        return nums;
    }
};

在这里插入图片描述
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒江雪ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值