解决 LeetCode 922 题:按奇偶排序数组 II

解决 LeetCode 922 题:按奇偶排序数组 II

题目描述

给定一个非负整数数组 nums,其中一半整数是奇数,一半整数是偶数。要求对数组进行排序,以便当 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 * 10^4
  • nums.length 是偶数
  • nums 中一半是偶数
  • 0 <= nums[i] <= 1000

思路分析

1. 基本思路

给定一个数组 nums,题目要求将数组中的偶数放在所有偶数索引位置(即偶数下标),将奇数放在所有奇数索引位置。由于题目给定了一个条件:数组中一半是奇数,一半是偶数,因此,我们只需要将所有偶数和奇数分开并分别放置到合适的索引位置。

2. 如何分配偶数和奇数?

  • 遍历整个数组,找出其中的偶数和奇数。
  • 使用两个数组 evenodd 分别存放偶数和奇数。
  • 然后将 even 中的偶数按照偶数索引(0, 2, 4, …)放入结果数组,将 odd 中的奇数按照奇数索引(1, 3, 5, …)放入结果数组。

3. 时间复杂度

  • 遍历数组的时间复杂度为 O(n),其中 n 是数组的长度。
  • 每次操作都只需要常数时间,因此总的时间复杂度为 O(n)

4. 空间复杂度

  • 我们使用了两个额外的数组 evenodd,所以空间复杂度是 O(n)

代码实现

class Solution:def sortArrayByParityII(self, nums: List[int]) -> List[int]:n = len(nums)even = []  # 存储偶数odd = []   # 存储奇数res = []   # 最终结果数组# 将偶数和奇数分开for num in nums:if num % 2 == 0:even.append(num)else:odd.append(num)# 将偶数和奇数分别放到合适的位置for i in range(n // 2):res.append(even[i])  # 偶数放在偶数位置res.append(odd[i])   # 奇数放在奇数位置return res

代码解释

  1. 初始化:

    • n = len(nums) 获取数组的长度。
    • evenodd 数组分别用于存储偶数和奇数。
    • res 数组用于存放最终的结果。
  2. 遍历数组:

    • 使用 for num in nums 遍历数组中的每个元素。
    • 判断当前元素是偶数还是奇数,将偶数放入 even 数组,将奇数放入 odd 数组。
  3. 填充结果数组:

    • 使用 for i in range(n // 2) 遍历每个偶数位置。
    • 在每个偶数位置放入 even[i],在每个奇数位置放入 odd[i]
  4. 返回结果:

    • 最终返回 res 数组,即按奇偶排序后的数组。

优化建议

进阶:在原地操作,减少空间使用

题目要求我们使用更少的额外空间。可以使用原地交换的方法来解决问题,不需要额外创建新的数组。

优化思路:

  • 我们可以直接在原数组 nums 中进行交换。
  • 使用两个指针 even_indexodd_index,分别指向数组中的偶数位置和奇数位置。
  • 如果当前 even_index 位置不是偶数,就与下一个偶数交换;如果当前 odd_index 位置不是奇数,就与下一个奇数交换。

代码实现(原地交换)

class Solution:def sortArrayByParityII(self, nums: List[int]) -> List[int]:even_index = 0  # 偶数位置odd_index = 1   # 奇数位置while even_index < len(nums) and odd_index < len(nums):if nums[even_index] % 2 == 0:even_index += 2  # 如果当前偶数位置是偶数,直接跳到下一个偶数位置elif nums[odd_index] % 2 != 0:odd_index += 2  # 如果当前奇数位置是奇数,直接跳到下一个奇数位置else:# 如果当前偶数位置是奇数,当前奇数位置是偶数,交换它们nums[even_index], nums[odd_index] = nums[odd_index], nums[even_index]even_index += 2odd_index += 2return nums

代码解析

  • 偶数和奇数指针:

    • even_index = 0odd_index = 1,分别指向数组中的偶数和奇数位置。
  • 遍历交换:

    • even_index 指向偶数,odd_index 指向奇数时,如果它们不满足条件(偶数位置不是偶数,奇数位置不是奇数),就交换它们。
  • 返回结果:

    • 返回修改后的 nums 数组,直接在原数组上进行操作。

总结

本题要求对数组按奇偶排序,最直接的方法是通过两个数组分别存放偶数和奇数,然后按照位置填充。然而,考虑到空间复杂度问题,我们可以通过双指针的方式在原地交换数组,减少额外的空间使用。

通过这样的思路,我们可以在 O(n) 时间内完成问题的求解,且空间复杂度可以优化到 O(1),提高算法的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis教程

Redis 教程 Redis 是一个开源的内存数据结构存储系统&#xff0c;用作数据库、缓存和消息代理。以下是一些基础知识和常用操作。 一、简介 Redis 支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。它具有高性能、高可用性和数据持久化的特性。 二、安…

力扣988. 从叶结点开始的最小字符串

Problem: 988. 从叶结点开始的最小字符串 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 在先序遍历的过程中&#xff0c;用一个变量path拼接记录下其组成的字符串&#xff0c;当遇到根节点时再将其反转并比较大小&#xff08;字典顺序大小&…

本地Ollama部署DeepSeek R1模型接入Word

目录 1.本地部署DeepSeek-R1模型 2.接入Word 3.效果演示 4.问题反馈 上一篇文章办公新利器&#xff1a;DeepSeekWord&#xff0c;让你的工作更高效-CSDN博客https://blog.csdn.net/qq_63708623/article/details/145418457?spm1001.2014.3001.5501https://blog.csdn.net/qq…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…

几种用户鉴权的方式对比

几种用户鉴权的方式对比 最近也要准备秋招&#xff0c;刚好整理下前后端一般采用的几种鉴权方式。 一、传统用户鉴权 详细步骤 用户登录 用户通过前端提交用户名和密码到后端服务器&#xff0c;后端服务器验证用户名和密码是否正确。如果验证成功&#xff0c;后端生成一个 s…

基于springboot+vue的航空散货调度系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

区块链的核心原理:加密算法、共识机制与分布式账本

区块链&#xff08;Blockchain&#xff09;技术自比特币诞生以来&#xff0c;已经从一个单纯的数字货币系统演变为广泛应用于金融、供应链、医疗、政府等多个领域的技术架构。作为一种去中心化的分布式账本技术&#xff0c;区块链的核心原理主要依赖于三个关键组成部分&#xf…

算法总结-二分查找

文章目录 1.搜索插入位置1.答案2.思路 2.搜索二维矩阵1.答案2.思路 3.寻找峰值1.答案2.思路 4.搜索旋转排序数组1.答案2.思路 5.在排序数组中查找元素的第一个和最后一个位置1.答案2.思路 6.寻找旋转排序数组中的最小值1.答案2.思路 1.搜索插入位置 1.答案 package com.sunxi…

以AI为翼:技术能力进阶的新路径

一、引言 1.1 研究背景与意义 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动各领域发展的核心驱动力。从最初简单的算法模型到如今复杂的深度学习架构&#xff0c;AI 技术取得了令人瞩目的进步。自 20 世纪 50 年代人工智能概念提出以来&#x…

Altium Designer绘制原理图时画斜线的方法

第一步&#xff1a;检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项&#xff0c;点击OK即可。如下图所示&#xff1a; 然后在划线时&#xff0c;按下shift空格就能够切换划线…

前缀和多种基础

前缀和加法 #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int n; const int N 1e310; int arr[N]; int pre[N]; int org[N]; int main(void) {cin >> n;for(int i 1 ; i < n ; i){cin >> arr[i];pre[i] …

Elasticsearch基本使用详解

文章目录 Elasticsearch基本使用详解一、引言二、环境搭建1、安装 Elasticsearch2、安装 Kibana&#xff08;可选&#xff09; 三、索引操作1、创建索引2、查看索引3、删除索引 四、数据操作1、插入数据2、查询数据&#xff08;1&#xff09;简单查询&#xff08;2&#xff09;…

Intel 与 Yocto 项目的深度融合:全面解析与平台对比

在嵌入式 Linux 领域&#xff0c;Yocto 项目已成为构建定制化 Linux 发行版的事实标准&#xff0c;广泛应用于不同架构的 SoC 平台。Intel 作为 x86 架构的领导者&#xff0c;在 Yocto 生态中投入了大量资源&#xff0c;为其嵌入式处理器、FPGA 和 AI 加速硬件提供了完整的支持…

如何在Arduino上使用NodeMCU

要在 Arduino IDE 中烧录 NodeMCU&#xff0c;可以按照以下步骤进行&#xff1a; 准备工作 硬件准备&#xff1a; 一根 USB 数据线&#xff0c;用于连接电脑和 NodeMCU 开发板。NodeMCU 开发板&#xff08;CH340 驱动版&#xff09;。 软件准备&#xff1a; 安装 Arduino IDE…

java命令详解

这里以jdk8为例子&#xff0c;查看默认的垃圾回收器 java -XX:PrintCommandLineFlags -version-XX:UseParallelGC : Parallel Scavenge 和 Parallel Old 组合 -XX:InitialHeapSize268435456 : 初始化堆大小&#xff08;字节&#xff09; -XX:MaxHeapSize4294967296 : 最大堆大…

Java/Kotlin HashMap 等集合引发 ConcurrentModificationException

在对一些非并发集合同时进行读写的时候&#xff0c;会抛出 ConcurrentModificationException 异常产生示例 示例一&#xff08;单线程&#xff09;&#xff1a; 遍历集合时候去修改 抛出 ConcurrentModificationException 的主要原因是当你在遍历一个集合&#xff08;如 Map…

Apache Hudi数据湖技术应用在网络打车系统中的系统架构设计、软硬件配置、软件技术栈、具体实现流程和关键代码

网络打车系统利用Hudi数据湖技术成功地解决了其大规模数据处理和分析的难题&#xff0c;提高了数据处理效率和准确性&#xff0c;为公司的业务发展提供了有力的支持。 Apache Hudi数据湖技术的一个典型应用案例是网络打车系统的数据处理场景&#xff0c;具体如下&#xff1a; 大…

51单片机看门狗系统

在 STC89C52 单片机中&#xff0c;看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定&#xff0c;但是它在头文件中并未给出&#xff0c;因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…

DeepSeek:人工智能领域的革新者与未来展望

在当今这个数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度发展&#xff0c;而DeepSeek作为这一领域的先锋&#xff0c;正引领着AI技术的创新与突破。作为一家致力于推动人工智能技术创新与应用的前沿企业&#xff0c;DeepSeek不仅在多语言编…

中间件的概念及基本使用

什么是中间件 中间件是ASP.NET Core的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…