算法题 按奇偶排序数组

905. 按奇偶排序数组

问题描述

给定一个非负整数数组nums,返回一个数组,其中所有偶数元素位于所有奇数元素之前。你可以返回满足此条件的任意答案。

示例

输入: nums = [3,1,2,4] 输出: [2,4,3,1] 解释: 输出 [4,2,3,1], [2,4,1,3] 和 [4,2,1,3] 也会被接受。

算法思路

双指针原地交换

  1. 使用两个指针leftright,分别从数组开头和末尾开始
  2. left指针寻找奇数,right指针寻找偶数
  3. left找到奇数且right找到偶数时,交换两个元素
  4. 重复直到两个指针相遇

额外数组

  1. 创建一个新数组用于存储结果
  2. 第一次遍历将所有偶数放入新数组
  3. 第二次遍历将所有奇数放入新数组
  4. 返回新数组

代码实现

方法一:双指针原地交换

classSolution{/** * 按奇偶排序数组 - 双指针原地交换 * * @param nums 输入的非负整数数组 * @return 所有偶数在前,奇数在后的数组 */publicint[]sortArrayByParity(int[]nums){intleft=0;// 左指针,从数组开头开始intright=nums.length-1;// 右指针,从数组末尾开始// 当两个指针相遇时停止while(left<right){// 左指针寻找奇数(偶数就跳过)if(nums[left]%2==0){left++;}// 右指针寻找偶数(奇数就跳过)elseif(nums[right]%2==1){right--;}// 左指针找到奇数,右指针找到偶数,交换它们else{inttemp=nums[left];nums[left]=nums[right];nums[right]=temp;left++;right--;}}returnnums;}}

方法二:额外数组

classSolution{/** * 按奇偶排序数组 - 额外数组 * * @param nums 输入的非负整数数组 * @return 所有偶数在前,奇数在后的数组 */publicint[]sortArrayByParity(int[]nums){int[]result=newint[nums.length];// 创建结果数组intindex=0;// 结果数组的当前填充位置// 第一次遍历:将所有偶数放入结果数组for(intnum:nums){if(num%2==0){result[index++]=num;}}// 第二次遍历:将所有奇数放入结果数组for(intnum:nums){if(num%2==1){result[index++]=num;}}returnresult;}}

算法分析

  • 时间复杂度
    • 双指针:O(n),每个元素最多被访问一次
    • 额外数组:O(n),需要遍历数组两次
  • 空间复杂度
    • 双指针:O(1),原地修改
    • 额外数组:O(n),需要额外的数组空间

算法过程

输入:nums = [3,1,2,4]

双指针

  1. 初始状态:left=0,right=3,nums=[3,1,2,4]
  2. nums[0]=3(奇数),nums[3]=4(偶数)→ 交换 →nums=[4,1,2,3]left=1,right=2
  3. nums[1]=1(奇数),nums[2]=2(偶数)→ 交换 →nums=[4,2,1,3]left=2,right=1
  4. left >= right,循环结束,返回[4,2,1,3]

额外数组

  1. 创建结果数组result = [0,0,0,0]
  2. 第一次遍历找偶数:2,4result = [2,4,0,0]
  3. 第二次遍历找奇数:3,1result = [2,4,3,1]
  4. 返回[2,4,3,1]

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例int[]nums1={3,1,2,4};int[]result1=solution.sortArrayByParity(nums1.clone());System.out.println("Test 1: "+Arrays.toString(result1));// [4,2,1,3] 或其他有效答案// 测试用例2:全偶数int[]nums2={2,4,6,8};int[]result2=solution.sortArrayByParity(nums2.clone());System.out.println("Test 2: "+Arrays.toString(result2));// [2,4,6,8]// 测试用例3:全奇数int[]nums3={1,3,5,7};int[]result3=solution.sortArrayByParity(nums3.clone());System.out.println("Test 3: "+Arrays.toString(result3));// [1,3,5,7]// 测试用例4:单元素int[]nums4={5};int[]result4=solution.sortArrayByParity(nums4.clone());System.out.println("Test 4: "+Arrays.toString(result4));// [5]// 测试用例5:空数组int[]nums5={};int[]result5=solution.sortArrayByParity(nums5.clone());System.out.println("Test 5: "+Arrays.toString(result5));// []// 测试用例6:偶数在前int[]nums6={2,4,1,3};int[]result6=solution.sortArrayByParity(nums6.clone());System.out.println("Test 6: "+Arrays.toString(result6));// [2,4,3,1] 或其他有效答案// 测试用例7:奇数在前int[]nums7={1,3,2,4};int[]result7=solution.sortArrayByParity(nums7.clone());System.out.println("Test 7: "+Arrays.toString(result7));// [4,2,3,1] 或其他有效答案}

关键点

  1. 问题

    • 这是一个分组问题,将数组分为偶数和奇数两组
    • 不需要保持原有顺序,只要满足偶数在前即可
  2. 双指针核心思想

    • 利用两个指针从两端向中间移动
    • 找到"错位"的元素(左边的奇数和右边的偶数)进行交换
    • 保证交换后左边都是偶数,右边都是奇数
  3. 边界处理

    • 空数组和单元素数组的处理
    • 全偶数或全奇数的特殊情况

常见问题

  1. 双指针?
    • 每次交换都是将一个偶数移到左边,一个奇数移到右边
    • 当指针相遇时,左边的所有元素都是偶数,右边的所有元素都是奇数

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

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

相关文章

Z-Image-Turbo动态模糊:速度感与运动轨迹表现

Z-Image-Turbo动态模糊&#xff1a;速度感与运动轨迹表现 技术背景与创新动机 在AI图像生成领域&#xff0c;静态画面的美学表现已趋于成熟&#xff0c;但对动态视觉效果的模拟仍存在明显短板。传统扩散模型擅长生成“凝固瞬间”的高质量图像&#xff0c;却难以自然呈现物体运…

基于LangChain与RAG技术构建智能客服问答系统:完整实现指南

引言 随着人工智能技术的快速发展&#xff0c;构建智能化的客服系统已成为企业提升服务质量的重要手段。传统的客服系统往往依赖人工处理&#xff0c;效率低下且成本高昂。而基于检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术的客服系统&#…

从攻击到防御:演练通信中的失效、伪造等威胁手法及其关键防范要点

网络安全小课堂——网络安全基础知识 信息安全&#xff1a;为数据处理系统建立和采用的技术和管理的安全保护&#xff0c;保护计算机硬件、软件和数据不因偶然和恶意的原因遭到破坏、更改和泄露。 网络安全&#xff1a;防止未授权的用户访问信息&#xff0c;防止未授权而试图…

Python---面向对象编程思想迁移

一、核心认知&#xff1a;面向过程 vs 面向对象先明确两种编程思想的本质差异&#xff0c;才能理解 “迁移” 的核心逻辑&#xff1a;维度面向过程&#xff08;Procedure-Oriented&#xff09;面向对象&#xff08;Object-Oriented&#xff09;核心单元函数 / 步骤&#xff08;…

为什么选Z-Image-Turbo?三大核心优势全面解析

为什么选Z-Image-Turbo&#xff1f;三大核心优势全面解析 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 在AI图像生成领域&#xff0c;速度、质量与易用性始终是开发者和创作者最关注的三大维度。阿里通义推出的 Z-Image-Turbo 模型&#xff0c;基于Diff…

K8s 集群部署基础:Linux 三节点 SSH 互信(免密登录)配置指南

文档说明 在 Kubernetes&#xff08;K8s&#xff09;集群部署与日常运维过程中&#xff08;如 kubeadm、Ansible、脚本化部署、批量运维等&#xff09;&#xff0c;控制节点与工作节点之间必须具备稳定的 SSH 互信能力。 本文档以 三台 Linux 节点 为示例&#xff0c;说明如何配…

算法题 子数组的最小值之和

907. 子数组的最小值之和 问题描述 给定一个整数数组 arr&#xff0c;计算所有非空连续子数组的最小值之和。由于答案可能很大&#xff0c;返回结果对 10^9 7 取模。 示例&#xff1a; 输入: arr [3,1,2,4] 输出: 17 解释: 子数组为 [3], [1], [2], [4], [3,1], [1,2], [2,4…

网络安全知识图谱硬核梳理:从基础到原理,从入门到实战的完整体系

随着互联网的普及和数字化进程的加速&#xff0c;网络安全已经成为我们生活中不可或缺的一部分。然而&#xff0c;很多人对于网络安全的概念仍然模糊不清。 那么&#xff0c;什么是网络安全&#xff1f;它究竟有多重要呢&#xff1f; 一、网络安全的定义 网络安全是指通过采取…

疑问解答:M2FP是否支持视频流实时解析?答案是肯定

疑问解答&#xff1a;M2FP是否支持视频流实时解析&#xff1f;答案是肯定 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与核心价值 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项比通用语义分割更精细的任务&#xff0…

M2FP更新日志:新增自动颜色映射,提升可视化体验

M2FP更新日志&#xff1a;新增自动颜色映射&#xff0c;提升可视化体验 &#x1f4d6; 项目简介&#xff1a;M2FP 多人人体解析服务 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;旨在将人体分解为多…

Python---面向对象的基本概念

一、面向对象的核心思想面向对象编程的核心是以 “对象” 为中心组织代码&#xff0c;把现实世界中的事物抽象为程序中的 “对象”&#xff0c;每个对象包含&#xff1a;属性&#xff1a;描述事物的特征&#xff08;如人的姓名、年龄&#xff0c;手机的品牌、价格&#xff09;&…

空间选择性ALE的两种工艺路径

空间选择性ALE的两种工艺路径 之前&#xff0c;我们聊过什么是ALE&#xff0c;详见文章&#xff1a;什么是原子层刻蚀&#xff08;ALE&#xff09;&#xff1f; 什么是空间选择性ALE&#xff1f; 空间选择性 ALE&#xff08;Spatially selective ALE&#xff09;&#xff0c…

空间选择性ALE的两种工艺路径

空间选择性ALE的两种工艺路径 之前&#xff0c;我们聊过什么是ALE&#xff0c;详见文章&#xff1a;什么是原子层刻蚀&#xff08;ALE&#xff09;&#xff1f; 什么是空间选择性ALE&#xff1f; 空间选择性 ALE&#xff08;Spatially selective ALE&#xff09;&#xff0c…

Z-Image-Turbo皮影戏风格图像生成实验

Z-Image-Turbo皮影戏风格图像生成实验 引言&#xff1a;当AI遇见传统艺术——皮影戏风格的探索之旅 在AI图像生成技术飞速发展的今天&#xff0c;我们不再满足于简单的“高清照片”或“动漫风格”&#xff0c;而是开始尝试将传统文化元素与现代生成模型深度融合。阿里通义推出的…

真实案例:某服装品牌用M2FP构建虚拟换装系统降本60%

真实案例&#xff1a;某服装品牌用M2FP构建虚拟换装系统降本60% 在数字化营销与个性化体验日益重要的今天&#xff0c;虚拟试衣已成为服装零售行业提升转化率、降低退货成本的关键技术。然而&#xff0c;传统方案依赖高精度3D建模和GPU集群推理&#xff0c;部署成本高昂&#x…

金电镀凸块的应用

金电镀凸块的应用什么是金凸块&#xff1f;金凸块&#xff08;Gold Bump / Au Bump&#xff09;是做在芯片焊盘&#xff08;Pad&#xff09;上的一类微型“凸起金属端子”&#xff0c;材料以金&#xff08;Au&#xff09;为主&#xff0c;用来把芯片与外部基板/玻璃/柔性板实现…

金电镀凸块的应用

金电镀凸块的应用什么是金凸块&#xff1f;金凸块&#xff08;Gold Bump / Au Bump&#xff09;是做在芯片焊盘&#xff08;Pad&#xff09;上的一类微型“凸起金属端子”&#xff0c;材料以金&#xff08;Au&#xff09;为主&#xff0c;用来把芯片与外部基板/玻璃/柔性板实现…

模型融合技巧:结合M2FP与其他CV模型

模型融合技巧&#xff1a;结合M2FP与其他CV模型 &#x1f4d6; 项目背景与技术痛点 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项基础但极具挑战的任务。它要求对图像中的人体进行像素级语义分割&#xff0c;精确识别出如头发、面部、上…

Z-Image-Turbo故障艺术(Glitch Art)特效实现

Z-Image-Turbo故障艺术&#xff08;Glitch Art&#xff09;特效实现 引言&#xff1a;从AI图像生成到数字美学实验 在当代数字艺术创作中&#xff0c;故障艺术&#xff08;Glitch Art&#xff09; 作为一种反常规、反完美的视觉表达形式&#xff0c;正逐渐被艺术家和开发者所…

M2FP色彩映射表:各身体部位对应颜色编码说明

M2FP色彩映射表&#xff1a;各身体部位对应颜色编码说明 &#x1f9e9; M2FP 多人人体解析服务 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;旨在将人体图像划分为多个具有明确语义的身体部位区域。…