力扣刷题练习八【922. 按奇偶排序数组II】

前言

数组题目练习。

练习题八 【922. 按奇偶排序数组II】


一、题目阅读

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

对数组进行排序,以便当 numsi 为奇数时,i 也是 奇数 ;当 numsi 为偶数时, 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

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


二、尝试实现

思路

  • 理解题目:长度肯定是偶数,因为说nums内元素一半奇数,一半偶数。说明如果i为奇数,numsi是偶数,肯定有个地方j是偶数,numsj是奇数。所以这成对出现,就可以在原数组里面找到交换的对象。给了在原数组上操作思路。
  • i只指向奇数下标,如果numsi也是奇数,i +=2k;继续往下。
  • i只指向奇数下标,如果numsi是偶数。用j指向偶数下标,while循环找numsj是奇数。找到之后交换。

代码实现

cpp 复制代码
class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int j=0;
        for(int i = 1 ;i < nums.size();i +=2){
            if(nums[i]%2 == 0){
                while(j < nums.size() && (nums[j]%2 == 0)){
                    j += 2;
                }
                swap(nums[i],nums[j]);
            }
        }
        return nums;
    }
};

三、参考答案

参考答案链接

学习内容

给了三种方法:

第三种方法最简洁和尝试实现中的思路一致,只不过奇偶换一下。思路里的成对出现,很能够简单解决,也不用额外记录谁换过谁没换过。


总结

如果一个奇数位对应偶数,那么肯定一个偶数位对应奇数。

(欢迎指正,转载标明出处)

相关推荐
小小工匠1 分钟前
Redis - 异步机制与阻塞规避:Redis 单线程模型的生存之道
数据结构·redis·性能优化·集群·持久化
2301_789015624 分钟前
Lnux权限
linux·开发语言·c++·权限
fengxin_rou5 分钟前
LeetCode 三道高频中等数组算法详解|除自身乘积、矩阵置零、螺旋矩阵
算法·leetcode·矩阵
8Qi89 小时前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
888CC++11 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
pluviophile_s12 小时前
数据结构:第2讲:线性表
数据结构·笔记
(●—●)橘子……12 小时前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
明志数科14 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
feng_you_ying_li14 小时前
C++复习二,继承与多态
c++