• [LeetCode] 922. Sort Array By Parity II


    Description

    Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.

    Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is even.

    You may return any answer array that satisfies this condition.

    Example 1:

    Input: [4,2,5,7]
    Output: [4,5,2,7]
    Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted.
    

    Note:

    1. 2 <= A.length <= 20000
    2. A.length % 2 == 0
    3. 0 <= A[i] <= 1000

    Analyse

    A是一个非负整数数组,一半奇数一半偶数

    A进行排序,使A的奇数位置为奇数,偶数位置为偶数

    使用两个int变量存储奇数和偶数的位置

    even(偶) 存储第一个存了奇数的偶数位置

    odd(奇) 存储第一个存了偶数的奇数位置

    每一趟循环都找一遍oddeven,然后交换这两个位置的值,进入下一次循环

    下面是第一个版本的代码,写完后AC,甚至能faster than 100.00%

    vector<int> sortArrayByParityII(vector<int>& A) {
        int even = 0; // first even position with a odd
        int odd = 1;  // first odd position with a even
    
        for(int i = 0; i < A.size(); i++)
        {
            while ((A[even] % 2 == 0) && (even < A.size() - 1))
            {
                even += 2;
            }
    
            while ((A[odd] % 2 != 0) && (odd < A.size()))
            {
                odd += 2;
            }
    
            if ((i % 2) != (A[i] % 2))
            {
                int tmp = A[even];
                A[even] = A[odd];
                A[odd] = tmp;
            }
    
        }
        return A;
    }
    

    但是这个版本代码的循环退出条件有点怪,比如这些地方,for循环出现就很诡异,这个if判断后交换两元素的值也是,算出evenodd后并不一定会立即交换,而是会等到遍历到奇数位不为奇数或偶数位不为偶数时才交换,最后虽然能交换成功,但总归是不太好的解法

    我也不知道这个版本我怎么写出来的,似乎是在for循环输出vector的代码基础上改的

    for(int i = 0; i < A.size(); i++)
    
    if ((i % 2) != (A[i] % 2))
    {
        int tmp = A[even];
        A[even] = A[odd];
        A[odd] = tmp;
    }
    
    

    继续写第二个版本,思考循环终止条件,循环终止的时候每个奇数位都是奇数,偶数位都是偶数了

    再计算evenodd的时候就会大于A.size(),使用这个当作循环结束的条件(copy了LeetCode上的代码)

    vector<int> sortArrayByParityII(vector<int>& A) {
        int even = 0; // first even position with a odd
        int odd = 1;  // first odd position with a even
    
        while ((even < A.size() - 1) && odd < A.size())
        {
            while ((A[even] % 2 == 0) && (even < A.size() - 1))
            {
                even += 2;
            }
    
            if (even >= A.size() - 1)
            {
                break;
            }
    
            while ((A[odd] % 2 != 0) && (odd < A.size()))
            {
                odd += 2;
            }
    
            if (odd >= A.size())
            {
                break;
            }
    
            int tmp = A[even];
            A[even] = A[odd];
            A[odd] = tmp;
        }
        return A;
    }
    
  • 相关阅读:
    Just oj 2018 C语言程序设计竞赛(高级组)D: 四边形面积
    Just Oj 2017C语言程序设计竞赛高级组A: 求近似值(矩阵快速幂)
    HDU 1166 敌兵布阵(线段树/树状数组模板题)
    HDU 1541 STAR(树状数组)
    Just Oj 2017C语言程序设计竞赛高级组E: DATE ALIVE(二分匹配)
    Just Oj 2017C语言程序设计竞赛高级组D: 字符串最大表示(next数组)
    蓝桥杯 历届试题 小计算器
    蓝桥杯练习 十六进制转二进制
    51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)
    51 Nod 1240 莫比乌斯函数
  • 原文地址:https://www.cnblogs.com/arcsinw/p/10311901.html
Copyright © 2020-2023  润新知