LeetCode 0922.按奇偶排序数组 II:O(1)空间复杂度-一次遍历双指针

【LetMeFly】922.按奇偶排序数组 II:O(1)空间复杂度-一次遍历双指针

力扣题目链接:https://leetcode.cn/problems/sort-array-by-parity-ii/

给定一个非负整数数组 numsnums 中一半整数是 奇数 ,一半整数是 偶数

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数

你可以返回 任何满足上述条件的数组作为答案

示例 1:

复制代码
输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

示例 2:

复制代码
输入:nums = [2,3]
输出:[2,3]

提示:

  • 2 <= nums.length <= 2 * 104
  • nums.length 是偶数
  • nums 中一半是偶数
  • 0 <= nums[i] <= 1000

**进阶:**可以不使用额外空间解决问题吗?

解题方法:双指针

使用两个指针分别指向奇数下标和偶数下标。

当偶数下标指针不越界时,如果偶数下标指针指向的是偶数,就右移到下一个偶数下标;否则如果奇数下标指针指向的是奇数,就右移到下一个奇数下标;否则(奇数指针指偶数,偶数指针指奇数)就交换二者并集体右移。

为什么"当偶数下标指针不越界"这一个条件就够了?因为偶数下标越界时,说明偶数下标的元素全部符合,也说明奇数下标的元素全部合规了。

  • 时间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-02-04 22:15:09
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-04 22:23:51
 */
class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        for (int i = 0, j = 1; i < nums.size();) {
            if (nums[i] % 2 == 0) {
                i += 2;
            } else if (nums[j] % 2) {
                j += 2;
            } else {
                swap(nums[i], nums[j]);
                i += 2;
                j += 2;
            }
        }
        return nums;
    }
};
Python
python 复制代码
'''
Author: LetMeFly
Date: 2025-02-04 22:25:05
LastEditors: LetMeFly.xyz
LastEditTime: 2025-02-04 22:26:17
'''
from typing import List

class Solution:
    def sortArrayByParityII(self, nums: List[int]) -> List[int]:
        i, j = 0, 1
        while i < len(nums):
            if nums[i] % 2 == 0:
                i += 2
            elif nums[j] % 2:
                j += 2
            else:
                nums[i], nums[j] = nums[j], nums[i]
                i += 2
                j += 2
        return nums
Java
java 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-02-04 22:25:10
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-04 22:28:26
 */
class Solution {
    public int[] sortArrayByParityII(int[] nums) {
        for (int i = 0, j = 1; i < nums.length;) {
            if (nums[i] % 2 == 0) {
                i += 2;
            } else if (nums[j] % 2 != 0) {
                j += 2;
            } else {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i += 2;
                j += 2;
            }
        }
        return nums;
    }
}
Go
go 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-02-04 22:25:07
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-04 22:32:30
 */
package main

func sortArrayByParityII(nums []int) []int {
    for i, j := 0, 1; i < len(nums); {
		if nums[i] % 2 == 0 {
			i += 2
		} else if nums[j] % 2 == 1 {
			j += 2
		} else {
			nums[i], nums[j] = nums[j], nums[i]
			i += 2
			j += 2
		}
	}
	return nums
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/145445952

相关推荐
江畔柳前堤13 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore14 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考15 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX16 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面16 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号17 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽17 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI17 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者19 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者19 小时前
【征程6】校准量化中HistogramObserver解析
算法