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

本文介绍了LeetCode中剑指Offer21题的解决方案,通过双指针技巧实现奇数和偶数的互换。算法流程包括初始化双指针i和j,分别遍历数组的两端,找到奇数和偶数进行交换,确保奇数总在偶数前面。该算法的时间复杂度为O(n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述

一、双指针

解题思路:

考虑定义双指针 i,j 分列数组左右两端, 循环执行

  1. 指针 i 从左向右寻找偶数
  2. 指针 j 从右向左寻找奇数
  3. 将偶数 nums[i] 和奇数 nums[j] 交换

可始终保证:指针 i 左边都是奇数,指针 j 右边都是偶数
在这里插入图片描述
算法流程:

  1. 初始化:i,j 双指针,分别指向数组 nums 左右两端
  2. 循环交换:当 i = j 时跳出
    1. 指针 i 遇到奇数则执行 i = i + 1 跳过,直到找到偶数
    2. 指针 j 遇到偶数则执行 j = j - 1 跳过,直到找到奇数
    3. 交换 nums[i] 和 nums[j] 值
  3. 返回值:返回已修改的 nums 数组
class Solution {
    public int[] exchange(int[] nums) {
        int i = 0;
        int j = nums.length - 1;
        int temp = 0;
        while(i < j){
            while(i < j && (nums[i] & 1) == 1) i++;
            while(i < j && (nums[j] & 1) == 0) j--;
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
        return nums;
    }
}
  • 时间复杂度 O(n),n 为数组 nums 长度,双指针 i,j 共同遍历整个数组
  • 空间复杂度 O(1),双指针 i,j 使用常数大小的额外空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值