LeetCode 922. 按奇偶排序数组 II

简介: LeetCode 922. 按奇偶排序数组 II

题目

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

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

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

详见:922. 按奇偶排序数组 II

思路

  1. 交换奇偶数,牺牲内存,双指针交换偶数位上的奇数和奇数位上的偶数
  2. 遍历,动态一个新数组,遍历A,把偶数放在新数组的偶数位,奇数放在奇数位

方法三:两次遍历

遍历一遍数组把所有的偶数放进ans[0],ans[2],ans[4],以此类推。

再遍历一遍数组把所有的奇数依次放进 ans[1],ans[3],ans[5],以此类推。


方法四:双指针 如果原数组可以修改,则可以使用就地算法求解。 为数组的偶数下标部分和奇数下标部分分别维护指针 i,j。随后,在每一步中,如果

nums[i] 为奇数,则不断地向前移动 j(每次移动两个单位),直到遇见下一个偶数。此时,可以直接将nums[i] 与 nums[j]

交换。我们不断进行这样的过程,最终能够将所有的整数放在正确的位置上。


来源:力扣(LeetCode)

代码

方法一:交换奇偶数

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParityII(int* A, int ASize, int* returnSize){
        *returnSize = ASize;
        int* returnArray = (int*)malloc(sizeof(int) * ASize);
        int tmp;
        for(int i = 0; i < ASize; i = i + 2){
            for(int j = 1; j< ASize; j = j + 2){
                if( A[i]%2!=0 && A[j]%2==0 ){
                    tmp = A[i];
                    A[i] = A[j];
                    A[j] = tmp;
                    break;
                }
            }
        }
        return A;
}

方法二:遍历

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParityII(int* A, int ASize, int* returnSize){
    *returnSize = ASize;
    int* returnArray = (int*) malloc(sizeof(int) * ASize);
    for (int i = 0, j = 1, k = 0;  k < ASize; k++) {
        // 遍历偶数
        if (A[k] % 2 == 0) {
            returnArray[i] = A[k];
            i = i + 2;
        }
        // 遍历奇数
        else {
            returnArray[j] = A[k];
            j = j + 2;
        }
    }
    return returnArray;
}


目录
相关文章
|
3天前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
3天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
13 2
|
3天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
12 0
|
3天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
9 1
|
3天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
11 2
|
3天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
22 0
|
3天前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
3天前
【力扣】238. 除自身以外数组的乘积
【力扣】238. 除自身以外数组的乘积
|
3天前
|
C++
【力扣】2562. 找出数组的串联值
【力扣】2562. 找出数组的串联值
|
3天前
|
算法 C++ 索引
【力扣经典面试题】238. 除自身以外数组的乘积
【力扣经典面试题】238. 除自身以外数组的乘积